2010-03-23 11 views
6

Mã đơn giản sau tái tạo sự phát triển của java.lang.ref.WeakReference đối tượng trong đống:Memory rò rỉ của java.lang.ref.WeakReference các đối tượng bên trong lớp JDK

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

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

Đây là kết quả của lệnh jmap trong một khoảng giây vài :

[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 

Lưu ý rằng lệnh jmap bắt buộc 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 

Trả lời

0

Xác nhận dưới JDK 1.6.0_19 và 1.6.0_20, vắng mặt dưới 1.6.0_17:

phiên bản java "1.6.0_17" Java (TM) SE Runtime Environment (xây dựng 1.6.0_17-b04) Máy chủ Java HotSpot (TM) VM (xây dựng 14.3-b01, chế độ hỗn hợp)

Tham chiếu rò rỉ chồng lên trong java.util.logging.Logger # mảng con, nhưng hầu hết các thay đổi trong Lo gManager gây ra điều này.

4

Tôi đã sao chép điều này trên 1,6,0_19.

Nếu bạn chạy các ứng dụng mẫu với những lập luận java:

-Xms8m -Xmx8m -XX: MaxPermSize = 8m

Sau 10 - 15 phút, nó sẽ tạo ra một OutOfMemoryError.

Tôi đã gửi báo cáo lỗi với Sun. Họ sẽ cho tôi biết trong thời gian tới nếu nó đã được chấp nhận.

0

Mặt trời đã chấp nhận lỗi này trong trình theo dõi của họ, nhưng vì một số lý do nó không hiển thị trên trang web của họ, vì vậy tôi không thể đăng liên kết tại đây (chưa). Nói chuyện với Sun ngay bây giờ để hỏi họ chuyện gì đã xảy ra.