2010-03-23 5 views
6

El siguiente código simple reproduce el crecimiento de java.lang.ref.WeakReference objetos en el montón:Pérdida de memoria de java.lang.ref.WeakReference objetos dentro de las clases de JDK

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

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

Aquí está la salida del comando jmap dentro de un intervalo de pocos segundos :

[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 

Tenga en cuenta que el comando jmap fuerza a 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 

Respuesta

0

confirmada bajo JDK 1.6.0_19 y 1.6.0_20, ausente bajo 1.6.0_17:

versión java "1.6.0_17" Java (TM) SE Runtime Environment (compilación 1.6.0_17-b04) Java HotSpot (TM) Server VM (compilación 14.3-b01, modo mixto)

Referencias filtradas se acumulan en java.util.logging.Logger # kids array, pero lo más probable es que cambie en Lo gManager causó esto.

4

He reproducido esto en 1.6.0_19.

Si ejecuta la aplicación de ejemplo con estos argumentos java:

-Xms8m -Xmx8m -XX: MaxPermSize = 8m

Después de 10 - 15 minutos que se producirá un OutOfMemoryError.

He enviado un informe de error con Sun. Me avisarán a su debido tiempo si ha sido aceptado.

0

Sun ha aceptado este error en su rastreador, pero por alguna razón no se muestra en su sitio web, por lo que no puedo publicar un enlace aquí (todavía). Hablando con Sun ahora mismo para preguntarles qué pasó.