以下简单代码再现了堆中
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
解决方法
已在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.0_29,所以我认为在那里发布链接是有用的,所以修复它的事实是可以发现的.