2010-03-23 11 views
6

Poniższy prosty kod reprodukuje wzrost java.lang.ref.WeakReference obiektów na stercie:wyciek Pamięć java.lang.ref.WeakReference obiektów wewnątrz JDK klas

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

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

Oto wynik polecenia jmap ciągu kilku sekund odstępu :

[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 

Należy zauważyć, że polecenie jmap wymusza 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 

Odpowiedz

0

Potwierdzony pod JDK 1.6.0_19 i 1.6.0_20, nieobecny pod 1.6.0_17:

wersja java "1.6.0_17" Java (TM) SE Runtime Environment (budować 1.6.0_17-B04) Java HotSpot (TM) Server VM (build 14.3-B01, tryb mieszany)

Referencje przeciekające stos w java.util.logging.Logger # dzieci tablicy, ale najprawdopodobniej zmieni w Lo gManager to spowodował.

4

Odtworzono to w wersji 1.6.0_19.

Jeśli uruchomić przykładową aplikację z tych argumentów Java:

-Xms8m -Xmx8m -XX: MaxPermSize = 8m

Po 10 - 15 minutach będzie produkować OutOfMemoryError.

Złożyłem zgłoszenie błędu w firmie Sun. Powiadomią mnie w odpowiednim czasie, jeśli zostaną zaakceptowane.

0

Sun zaakceptował ten błąd w swoich trackerach, ale z jakiegoś powodu nie wyświetla się na ich stronie, więc nie mogę opublikować linku tutaj (jeszcze). Rozmawiając z Sunem teraz, aby zapytać ich, co się stało.

Powiązane problemy