2010-05-14 32 views
22

Bất cứ ai cũng có thể giải thích tại sao các dòng bên dưới xuất hiện trong bảng điều khiển đầu ra khi chạy?Ý nghĩa của thông báo "Loại bỏ lớp"

(một câu trả lời có thể sẽ tràn ngập PermGen, nhưng điều này có thể được loại trừ khả năng kể từ khi chương trình chỉ sử dụng 24MB ra khỏi max100MB sẵn trong PermGen)

[Dỡ lớp sun.reflect.GeneratedSerializationConstructorAccessor28]
[Dỡ lớp sun.reflect.GeneratedSerializationConstructorAccessor14]
[Dỡ lớp sun.reflect.GeneratedSerializationConstructorAccessor4]
[Dỡ lớp sun.reflect.GeneratedMethodAccessor5]
[Dỡ lớp sun.reflect.Gen eratedSerializationConstructorAccessor38]
[Dỡ lớp sun.reflect.GeneratedSerializationConstructorAccessor36]
[Dỡ lớp sun.reflect.GeneratedSerializationConstructorAccessor22]
[lớp Dỡ sun.reflect.GeneratedSerializationConstructorAccessor8]
[Dỡ lớp sun.reflect.GeneratedSerializationConstructorAccessor39]
[Dỡ lớp sun.reflect.GeneratedSerializationConstructorAccessor16]
[Dỡ lớp sun.reflect.GeneratedSerializationConstructorAccessor2]
[Dỡ lớp sun.reflect.GeneratedConstructorAccessor1]

chương trình này chạy với params sau:

-Xmx160M
-XX: MaxPermSize = 96M
-XX: PermSize = 96M
-XX: + UseConcMarkSweepGC
-XX: + UseParNewGC
-XX: + PrintGCTaskTimeStamps
-XX: + PrintHeapAtGC
-XX: + PrintTenuringDistribution
-XX: + PrintGCDetails
-XX: + Pr intGCDateStamps
-XX: + PrintGCTimeStamps
verbose: gc
-Xloggc: /logs/gc.log

Có rất nhiều không gian trong heap và trong PermGen.

Trả lời

17

Các lớp đó được giữ là softreferences luôn đủ điều kiện cho GC. GC không cho phép chỉ chạy khi đạt đến bộ nhớ tối đa, nó cũng sẽ chạy khi có chỗ cho nó, nếu bạn hiểu ý tôi.

Các lớp đó theo cách được sử dụng "dưới mui xe" của API tuần tự hóa sử dụng phản chiếu để truy cập các trường và gọi phương thức.


Cập nhật: để đăng nhập dỡ lớp để thiết bị xuất chuẩn thay vì đường dẫn theo quy định tại -Xloggc, đã có một báo cáo lỗi cho chính xác vấn đề này: Bug ID 6637203. Điều này đã được sửa lại sau 4 tháng. Nâng cấp JVM của bạn lên phiên bản mới nhất.

+0

cảm ơn - Tôi hiểu ý của bạn là ...nhưng tại sao những thông điệp này được chuyển hướng đặc biệt vào bảng điều khiển đầu ra, thay vì, ví dụ, các bản ghi gc? Họ có một số loại ý nghĩa đặc biệt (tác động đến hiệu suất có thể)? – Eleco

+0

Theo như tôi biết nó là theo mặc định không đăng nhập. Nó sẽ chỉ được ghi lại khi bạn sử dụng đối số '-verbosegc'. Bạn đang thực thi JVM như thế nào? Bạn đã sử dụng đối số nào (hoặc IDE)? Điều này sẽ không có tác động hiệu suất. GC thường chỉ chạy khi có chỗ cho (tức là JVM không có gì khác để làm) hoặc tại thời điểm cuối cùng khi đạt đến bản ghi tối đa. Các nhật ký này chỉ hữu ích cho các mục đích không chính thức/gỡ lỗi. – BalusC

+0

Tôi đã chỉnh sửa câu hỏi ban đầu để bao gồm các công tắc JVM được sử dụng ... Tôi có thể nghĩ rằng bất kỳ thông báo liên quan đến gc nào cũng sẽ đi tới tệp nhật ký gc.log, nhưng sau đó có thể xóa phần mềm giải quyết là trường hợp đặc biệt. – Eleco

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