2010-03-23 7 views
6

Die folgenden einfachen Code, um das Wachstum von java.lang.ref.WeakReference Objekte im Heap reproduziert:Speicherleck von java.lang.ref.WeakReference Objekte innerhalb JDK Klassen

public static void main(String[] args) throws Exception { 

while (true) { 
java.util.logging.Logger.getAnonymousLogger(); 
Thread.sleep(1); 
} 
} 

Hier ist die Ausgabe von jmap Befehl innerhalb von ein paar Sekunden Intervall :

[email protected]:~> 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 
[email protected]:~> 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 
[email protected]:~> 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 

Beachten Sie, dass Jmap-Befehl FullGC erzwingt.

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 

Antwort

0

unter JDK Bestätigte 1.6.0_19 und 1.6.0_20, fehlt unter 1.6.0_17:

java version "1.6.0_17" Java (TM) SE Runtime Environment (bauen 1.6.0_17-b04) Java HotSpot (TM) Server VM (Build 14.3-b01, mixed mode)

Referenzen in java.util.logging.Logger # Kinder Array anhäufen undicht, aber die meisten ändert sich wahrscheinlich in Lo gManager hat dies verursacht.

4

Ich habe dies auf 1.6.0_19 reproduziert.

Wenn Sie die Beispielanwendung mit diesen Java-Argumenten laufen:

-Xms8m -Xmx8m -XX: MaxPermSize = 8m

Nach 10 bis 15 Minuten werden sie eine OutOfMemoryError produzieren.

Ich habe einen Fehlerbericht mit Sun eingereicht. Sie werden mich zu gegebener Zeit wissen lassen, ob es angenommen wurde.

0

Die Sonne hat diesen Fehler in ihrem Tracker akzeptiert, aber aus irgendeinem Grund erscheint sie nicht auf ihrer Website, daher kann ich (noch) keinen Link hier posten. Im Gespräch mit Sun, um sie zu fragen, was passiert ist.