2010-03-23 1 views
6

Следующий простой код воспроизводит рост java.lang.ref.WeakReference объектов в куче:утечка памяти java.lang.ref.WeakReference объектов внутри классов JDK

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

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

Вот вывод команды jmap в течение нескольких секунд интервала :

[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 

Обратите внимание, что команда 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 

ответ

0

Подтвержденные под JDK 1.6.0_19 и 1.6.0_20, отсутствует под 1.6.0_17:

ява версия "1.6.0_17" Java (TM) SE Runtime Environment (build 1.6.0_17-b04) VM VM (сборка 14.3-b01, смешанный режим)

Ссылки, связанные с утечкой информации в java.util.logging.Logger # kids array, но, скорее всего, изменения в LogManager вызвало это.

4

Я воспроизвел это на 1.6.0_19.

Если запустить пример приложения с этими аргументами Java:

-Xms8m -Xmx8m -XX: MaxPermSize = 8м

Через 10 - 15 минут он будет продуцировать OutOfMemoryError.

Я подал сообщение об ошибке с помощью Sun. Они сообщают мне в свое время, если они будут приняты.

0

Солнце приняло эту ошибку в своем трекере, но по какой-то причине не появляется на своем сайте, поэтому я не могу размещать ссылку здесь (пока). Разговаривая с Солнцем прямо сейчас, чтобы спросить их, что случилось.

5

Исправлено в 1.6.0_29: http://www.oracle.com/technetwork/java/javase/6u29-relnotes-507960.html?ssSourceSiteId=ocomen

1.6.0_29 не упоминается о сама страница с ошибкой (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6942989), поэтому я подумал, что было бы полезно разместить ссылку там, так что факт, что она исправлена, является доступной для обнаружения.