以下简单代码重现了堆中java.lang.ref.WeakReference
个对象的增长:
public static void main(String[] args) throws Exception {
while (true) {
java.util.logging.Logger.getAnonymousLogger();
Thread.sleep(1);
}
}
以下是几秒间隔内jmap命令的输出:
user@t1007:~> jmap -d64 -histo:live 29201|grep WeakReference
8: 22493 1079664 java.lang.ref.WeakReference
31: 1 32144 [Ljava.lang.ref.WeakReference;
106: 17 952
com.sun.jmx.mbeanserver.WeakIdentityHashMap$IdentityWeakReference
user@t1007:~> jmap -d64 -histo:live 29201|grep WeakReference
8: 23191 1113168 java.lang.ref.WeakReference
31: 1 32144 [Ljava.lang.ref.WeakReference;
103: 17 952
com.sun.jmx.mbeanserver.WeakIdentityHashMap$IdentityWeakReference
user@t1007:~> jmap -d64 -histo:live 29201|grep WeakReference
8: 23804 1142592 java.lang.ref.WeakReference
31: 1 32144 [Ljava.lang.ref.WeakReference;
103: 17 952 com.sun.jmx.mbeanserver.WeakIdentityHashMap$IdentityWeakReference
请注意,jmap命令会强制使用FullGC。
JVM settings:
export JVM_OPT="\
-d64 \
-Xms200m -Xmx200m \
-XX:MaxNewSize=64m \
-XX:NewSize=64m \
-XX:+UseParNewGC \
-XX:+UseConcMarkSweepGC \
-XX:MaxTenuringThreshold=10 \
-XX:SurvivorRatio=2 \
-XX:CMSInitiatingOccupancyFraction=60 \
-XX:+UseCMSInitiatingOccupancyOnly \
-XX:+CMSParallelRemarkEnabled \
-XX:+DisableExplicitGC \
-XX:+CMSClassUnloadingEnabled \
-XX:+PrintGCTimeStamps \
-XX:+PrintGCDetails \
-XX:+PrintTenuringDistribution \
-XX:+PrintGCApplicationConcurrentTime \
-XX:+PrintGCApplicationStoppedTime \
-XX:+PrintGCApplicationStoppedTime \
-XX:+PrintClassHistogram \
-XX:+ParallelRefProcEnabled \
-XX:SoftRefLRUPolicyMSPerMB=1 \
-verbose:gc \
-Xloggc:$GCLOGFILE"
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Server VM (build 16.0-b13, mixed mode)
Solaris 10/Sun Fire(TM) T1000
答案 0 :(得分:5)
已在1.6.0_29中修复:http://www.oracle.com/technetwork/java/javase/6u29-relnotes-507960.html?ssSourceSiteId=ocomen
错误页面本身(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6942989)没有提到<1.6> 1.6.0_29,所以我认为在那里发布链接是有用的,所以修复它的事实是可以发现的。答案 1 :(得分:4)
我已于1.6.0_19复制了这篇文章。
如果使用以下java参数运行示例应用程序:
-Xms8m -Xmx8m -XX:MaxPermSize = 8m
10-15分钟后,它将产生一个OutOfMemoryError。
我已经向Sun提交了一份错误报告。如果被接受,他们会在适当的时候告诉我。
答案 2 :(得分:4)
看起来,它将在JDK 7中修复。在http://bugs.sun.com/view_bug.do?bug_id=6942989,它说: 发布固定7(b102)
答案 3 :(得分:0)
在JDK 1.6.0_19和1.6.0_20下确认,缺少1.6.0_17:
java版“1.6.0_17” Java(TM)SE运行时环境(版本1.6.0_17-b04) Java HotSpot(TM)服务器VM(版本14.3-b01,混合模式)
在java.util.logging.Logger #lets数组中引用漏洞,但很可能是LogManager中的更改引起了这种情况。
答案 4 :(得分:0)
Sun已经在他们的跟踪器中接受了这个错误,但由于某些原因它没有出现在他们的网站上,所以我不能在这里发布链接(还)。现在和Sun谈谈,问他们发生了什么事。