2010-03-23 5 views
6

Le JDK simple code suivant reproduit la croissance des java.lang.ref.WeakReference objets dans le tas:fuite de mémoire des objets à l'intérieur des classes java.lang.ref.WeakReference

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

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

est ici la sortie de commande jmap dans un intervalle quelques secondes :

[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 

Notez que la commande jmap force 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 

Répondre

0

confirmé sous 1.6.0_19 et 1.6.0_20 JDK, absent sous 1.6.0_17:

java version "1.6.0_17" Java (TM) SE Runtime Environment (construire 1.6.0_17-b04) Java HotSpot (TM) VM Server (construction 14.3-B01, mode mixte)

Références fuite pile dans java.util.logging.Logger tableau # enfants, mais les changements les plus probablement Lo gManager a provoqué cela.

4

Je l'ai reproduit le 1.6.0_19.

Si vous exécutez l'exemple d'application avec ces arguments java:

-Xms8m -Xmx8m -XX: MaxPermSize = 8 m

Après 10 - 15 minutes, il produira un OutOfMemoryError.

J'ai déposé un rapport de bug avec Sun. Ils me feront savoir en temps voulu si cela a été accepté.

0

Sun a accepté ce bug dans leur tracker, mais pour une raison quelconque, il n'apparaît pas sur leur site web, donc je ne peux pas poster un lien ici (pour le moment). Parler à Sun dès maintenant pour leur demander ce qui s'est passé.