2010-05-14 8 views
22

¿Alguien puede explicar por qué las líneas siguientes aparecen en la consola de salida en tiempo de ejecución?Significado de los mensajes de "clase de descarga"

(una respuesta posible sería completa PermGen, pero esto puede ser descartado ya que el programa sólo utiliza 24 MB de la max100MB disponible en PermGen)

[clase de descarga sun.reflect.GeneratedSerializationConstructorAccessor28]
[Descarga clase sun.reflect.GeneratedSerializationConstructorAccessor14]
[clase de descarga sun.reflect.GeneratedSerializationConstructorAccessor4]
[clase de descarga sun.reflect.GeneratedMethodAccessor5]
[clase sun.reflect.Gen Descarga eratedSerializationConstructorAccessor38]
[clase de descarga sun.reflect.GeneratedSerializationConstructorAccessor36]
[clase de descarga sun.reflect.GeneratedSerializationConstructorAccessor22]
[clase de descarga sun.reflect.GeneratedSerializationConstructorAccessor8]
[clase de descarga sun.reflect.GeneratedSerializationConstructorAccessor39]
[Descarga clase sun.reflect.GeneratedSerializationConstructorAccessor16]
[clase de descarga sun.reflect.GeneratedSerializationConstructorAccessor2]
[clase de descarga sun.reflect.GeneratedConstructorAccessor1]

el programa se ejecuta con los siguientes params:

-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

Hay un montón de espacio en la pila y en PermGen.

Respuesta

17

Esas clases se mantienen como softreferences que siempre son elegibles para GC. El GC no se ejecuta en sí solo cuando se alcanza la memoria máxima, también se ejecutará cuando haya espacio para ello, si entiendes lo que quiero decir.

Esas clases son, por cierto, utilizadas "debajo de los capós" de la API de serialización que utiliza la reflexión para acceder a los campos e invocar métodos.


actualización: para registrar la descarga de la clase a la salida estándar en lugar de la ruta como se especifica en -Xloggc, ha habido un informe de error precisamente para este problema: Bug ID 6637203. Esto fue arreglado hace 4 meses. Actualice su JVM a la última.

+0

gracias - entiendo a qué te refieres ...pero ¿por qué estos mensajes se dirigen específicamente a la consola de salida, en lugar de, digamos, a los registros de gc? ¿Tienen algún tipo de significado especial (tal vez el impacto en el rendimiento)? – Eleco

+0

Hasta donde yo sé, no está registrado por defecto. Solo se registrará cuando use el argumento '-verbosegc'. ¿Cómo estás ejecutando JVM? ¿Qué argumentos usaste (o el IDE)? Esto no debería tener un impacto en el rendimiento. El GC normalmente solo se ejecuta cuando hay espacio para (es decir, la JVM no tiene nada más que hacer) o en el último momento cuando se alcanza la memoria máxima. Esos registros solo son útiles para fines informales/de depuración. – BalusC

+0

He editado la pregunta original para incluir los conmutadores JVM utilizados ... Hubiera pensado que cualquier mensaje relacionado con gc iría al archivo de registro gc.log, pero, de nuevo, tal vez la eliminación de las referencias erróneas sea un caso especial. – Eleco

Cuestiones relacionadas