我有这样的代码:
public static class Obj {//Class within class
Long a;
}
private static final Map<String, Obj> map = new ConcurrentHashMap<>();
public static void main(String[] args)
{
for(long l = 0;l<10000090L;l++)
{
Obj o = new Obj();
o.a = l;
map.put("asd", o);
map.remove("asd");
}
}
在我的 PC 上,我已在线程中添加了此代码 - 因此我可以轻松查看内存使用情况。我已经开始使用 Your Kit Java Profiler 对其进行分析。
我向 VM 添加了其他参数:-XX:+UseConcMarkSweepGC -XX:+UseTLAB -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing
我测试此程序的结果:循环前您的套件显示 - 用户 Par 服务空间 0 字节,用户 Par 伊甸园空间 12 mb,使用 CMS Old Gen 0 字节 战利品后您的套件显示 - 用户 Par 服务空间 8 KB,用户 Par伊甸园空间 38 mb,使用 CMS 老一代 0 字节 1,6 mb
然后我强制垃圾收集器,结果:您的工具包显示 - 用户 Par 服务空间 0 字节,用户 Par Eden 空间 1.4 mb,使用 CMS Old Gen 1.5 mb
因此,如果我正确读取此值,则 Obj 或“asd”将保留在内存中,直到完全垃圾收集器。有没有办法让这些对象被实时删除,而无需等待垃圾收集器检查程序中的每个对象是否都可以访问?