gpt4 book ai didi

java - 什么时候收集 perm gen?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:43 26 4
gpt4 key购买 nike

我正在开发一个 Tomcat 应用程序,它使用 CMS 收集器和内存条来触发 GC。当我重新加载 webapps 时,我有时会遇到这样一种情况,即老一代已满足以触发 GC,但死掉的类加载器不会被收集。

我读到类被分配到 perm gen 并猜测它们因此被 Old gen 集合忽略。我写了下面的测试类来测试这个理论。

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 监视了输出,发现确实发生了多个 Old 和 Young gen 收集,但没有收集死的 Classloader,因此大字节数组保留在内存中。

VisualVM Visual GC

什么会触发 Perm Gen 被收集?

最佳答案

检查 JVM 选项“CMSPermGenSweepingEnabled”和“CMSClassUnloadingEnabled”。(网上有很多关于它们的使用的讨论。)特别是,第一个假设将 PermGen 包含在垃圾收集运行中。默认情况下,PermGen 空间从不包含在垃圾回收中(因此无限增长)。

关于java - 什么时候收集 perm gen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8017193/

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