6

下面的简单代码再现了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 
4

5 回答 5

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.0_29 ,所以我认为在此处发布链接会很有用,所以事实上它是已修复是可发现的。

于 2012-01-11T04:05:04.443 回答
4

我已经在 1.6.0_19 上复制了这个。

如果您使用这些 java 参数运行示例应用程序:

-Xms8m -Xmx8m -XX:MaxPermSize=8m

10 - 15 分钟后,它将产生 OutOfMemoryError。

我已经向 Sun 提交了错误报告。如果被接受,他们会在适当的时候通知我。

于 2010-05-04T13:44:13.793 回答
4

看来,它将在 JDK 7 中修复。在http://bugs.sun.com/view_bug.do?bug_id=6942989,它说:Release Fixed 7(b102)

于 2010-11-08T10:10:08.257 回答
0

在 JDK 1.6.0_19 和 1.6.0_20 下确认,在 1.6.0_17 下不存在:

java 版本 "1.6.0_17" Java(TM) SE Runtime Environment (build 1.6.0_17-b04) Java HotSpot(TM) Server VM (build 14.3-b01, 混合模式)

引用泄漏堆积在 java.util.logging.Logger#kids 数组中,但很可能是 LogManager 中的更改导致了这种情况。

于 2010-04-22T17:46:15.813 回答
0

Sun 在他们的跟踪器中接受了这个错误,但由于某种原因,它没有出现在他们的网站上,所以我不能在这里发布链接(目前)。现在正在和 Sun 交谈,询问他们发生了什么事。

于 2010-05-28T13:53:21.700 回答