मैं टॉमकैट एप्लिकेशन पर काम करता हूं जो जीसी ट्रिगर करने के लिए मेमोरी बार के साथ सीएमएस कलेक्टर का उपयोग करता है। जब मैं वेबपैप्स को फिर से लोड करता हूं तो मैं कभी-कभी ऐसी परिस्थिति में समाप्त होता हूं जहां पुरानी जीन जीसी को ट्रिगर करने के लिए पर्याप्त है लेकिन मृत क्लासलोडर्स एकत्र नहीं होते हैं।परम जीन कब एकत्र किया जाता है?
मैंने पढ़ा कि कक्षाओं को परम जीन में आवंटित किया गया है और अनुमान लगाया गया है कि उन्हें पुराने जन संग्रहों द्वारा अनदेखा किया जा रहा था। मैंने इस सिद्धांत का परीक्षण करने के लिए निम्नलिखित टेस्ट क्लास लिखा था।
package test;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
/*
JVM Options:
-server -XX:+UseMembar -XX:+UseConcMarkSweepGC
-XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=80
-XX:+UseCMSInitiatingOccupancyOnly -Xms100m -Xmx100m
-XX:PermSize=100m -XX:NewSize=10m -XX:MaxNewSize=10m
-verbose:gc -Xloggc:gc.log -XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
*/
public class ClassLoaderTest extends ClassLoader
{
@Override
protected synchronized Class<?> loadClass(String xiName, boolean xiResolve)
throws ClassNotFoundException
{
if (xiName.equals("test"))
{
// When asked to load "test", load Example.class
Class<?> c = Example.class;
String className = c.getName();
String classAsPath = className.replace('.', '/') + ".class";
InputStream stream = c.getClassLoader().getResourceAsStream(classAsPath);
byte[] classData = null;
try
{
classData = IOUtils.toByteArray(stream);
}
catch (IOException e)
{
e.printStackTrace();
}
return defineClass(className, classData, 0, classData.length);
}
return super.loadClass(xiName, xiResolve);
}
public static class Example {}
public static ClassLoaderTest classLoaderTest;
public static void main(String[] args) throws Exception
{
// Allocate CL in new gen
classLoaderTest = new ClassLoaderTest();
// Load a class - allocated in perm gen
classLoaderTest.loadClass("test");
// Discard CL
classLoaderTest = null;
// Pause at end
Thread.sleep(99 * 60 * 1000);
}
public final byte[] mMem = new byte[85 * 1024 * 1024];
}
मैं इस वर्ग के भाग गया और उत्पादन VisualVM का उपयोग कर नजर रखी और कहा कि वास्तव में कई पुराने और युवा पीढ़ी मृत classloader बिना हो रहा संग्रह एकत्र किया जा रहा थे और इसलिए बड़े बाइट सरणी स्मृति में बने रहे देखा।
क्या पेर्म जनरल ट्रिगर करेगा एकत्र होने के लिए?
आप जानते हैं कि "पर्म" क्या है [... सही?] (Http://en.wiktionary.org/wiki/permanent#Adjective) –
जावा परम आवंटित स्मृति अभी भी एकत्र की जा सकती है। JVM पर्म जनरल का उपयोग डेटा रखने के लिए करता है जिसे वह बहुत ही कम से कम मुक्त होने की अपेक्षा करता है। – mchr