2008-12-04 36 views
9

Tôi đã kế thừa một applet Java (một số thực tế là <APPLET>) sẽ ném ngoại lệ OutOfMemory sau khoảng 4 ngày chạy. Bản chất của applet là như vậy mà mọi người thực sự sẽ để nó mở trong thời gian dài.constantPoolClass trong Java heap?

Sau gần hai ngày chạy, -histo jmap cho thấy người tiêu dùng đống hàng đầu như:

 
    num #instances #bytes class name 
    --- ---------- ------ ---------- 
     1:  14277 7321880 <constantPoolKlass> 
     2:  59626 5699968 <constMethodKlass> 
     3:  14047 5479424 <constantPoolCacheKlass> 
     4:  14277 5229744 <instanceKlassKlass> 
     5:  59626 4778944 <methodKlass> 
     6:  71026 3147624 <symbolKlass> 

Vấn đề là, tôi không hiểu những gì bất kỳ những thứ đang có. Có ít nhất hai điều xảy ra: constantPoolKlass + constantPoolCacheKlass + instanceKlassKlass xuất hiện liên quan, cũng như constMethodKlass + methodKlass. Từ tên, chúng xuất hiện liên quan đến trình nạp lớp.

Nếu tôi đã đoán tôi muốn nói applet đã tạo ra khoảng 14,277 đối tượng trong đó mỗi đối tượng có khoảng 4 phương pháp, với tổng số khoảng 59626 phương thức. Tuy nhiên, đầu ra jmap không hiển thị bất kỳ lớp nào với số lượng lớn các cá thể như vậy, cũng không giống như tổng số các đối tượng lớp khác thêm lên đến 14277. Vì vậy, có lẽ tôi không chính xác về những gì các đối tượng này làm. Ai đó có thể giải thích?

Trả lời

4

Yup, có vẻ như bạn đang làm rò rỉ trình tải lớp. Nếu bạn không thực sự tạo các trình nạp lớp trong mã của riêng bạn (thường là thông qua URLClassLoader.newInstance hoặc XSLT) thì nó có thể liên quan đến việc tải lại applet (mặc dù bạn thường sẽ lấy lại cùng trình nạp lớp). Nguyên nhân có thể có của rò rỉ là ThreadLocal, JDBC drivers và java.beans.

2

Spot on - rõ ràng là sự cố ClassLoader. Rất lạ để thấy rằng trong một applet mặc dù; bình thường nó chỉ là một vấn đề với các trình ứng dụng hoặc IDE.

2 cách để gỡ lỗi này: hoặc có được một hồ sơ đống thực sự mà có thể hiển thị cho bạn nơi dữ liệu lớp runaway của bạn được tham chiếu, hoặc vá các lớp API như đã mô tả ở đây: http://www.onjava.com/pub/a/onjava/2004/06/30/classloader2.html?page=2

Các vấn đề liên quan