gpt4 book ai didi

java - GroovyClassLoader 和 permgen

转载 作者:行者123 更新时间:2023-11-30 11:24:46 24 4
gpt4 key购买 nike

不幸的是,我们遇到了 PermgenError。 jmap -permstat 返回如下内容:

0x00000006c17f8520  1   1968    0x00000006ad000000  dead    sun/reflect/DelegatingClassLoader@0x00000007e00686e0
0x00000006babab308 3 19920 0x00000006b6874f88 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00000007e975bb80
0x00000006bca26800 3 15776 0x00000006b6874f88 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00000007e975bb80
0x00000006bb84db80 3 16176 0x00000006b6874f88 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00000007e975bb80
0x00000006b71dffd0 3 19272 0x00000006b6874f88 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00000007e975bb80

2 小时后 jmap -permstat 返回:

0x00000006c17f8520  1   1968    0x00000006ad000000  dead    sun/reflect/DelegatingClassLoader@0x00000007e00686e0
0x00000006babab308 3 19920 0x00000006b6874f88 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00000007e975bb80
0x00000006bca26800 43 437232 0x00000006b6874f88 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00000007e975bb80
0x00000006bb84db80 3 16176 0x00000006b6874f88 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00000007e975bb80
0x00000006b71dffd0 7 16176 0x00000006b6874f88 dead groovy/lang/GroovyClassLoader$InnerLoader@0x00000007e975bb80

如您所见,classLoader 加载的类数量从 3 增加到 43。这只是 permstat 的一小段 - (总计 = 4676 53521 436264528 alive=1,dead=4675)。我们使用参数运行 java:

-XX:+DisableExplicitGC -server -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:MaxGCPauseMillis=800 -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=1 -XX:+CMSClassUnloadingEnabled

但是在 permstat 中所有的类加载器都死了。我们解析常规类的代码:

class GroovyInvoker {

private static GroovyClassLoader gcl = new GroovyClassLoader(Thread.currentThread()
.getContextClassLoader());

protected static GroovyInvoker getInstance(String fileName, String className)
throws BaseScriptingException {

GroovyInvoker instance = new GroovyInvoker();
instance.setFileName(fileName);
instance.setClassName(className);
Class clazz;
clazz = GroovyInvoker.gcl.parseClass(instance.getFile(fileName));
Script aScript = (Script) clazz.newInstance();
instance.setScript(aScript);

return instance;
}
}

我阅读了这个主题:Locating code that is filling PermGen with dead Groovy code并回答 metaClassRegistry 问题,但我们现在无法在产品服务器上对其进行测试。我的问题是:当 Groovy 使用缓存时,为什么 GroovyClassLoader 加载的类数量会增加?这个数字不应该是常数吗?为什么 gc 不收集死的类加载器?

Java 版本 1.6.0_26。Groovy 版本 1.5.8。

最佳答案

我认为它与此有关: http://jira.codehaus.org/browse/GROOVY-6494

如果您不需要上下文类加载器,那么 GroovyClassLoader 就不会泄漏。

关于java - GroovyClassLoader 和 permgen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20566651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com