java debugging memory-leaks heap jmap

¿Qué significan esos extraños nombres de clase en un volcado de un montón de Java?



debugging memory-leaks (4)

Encontrará la lista completa documentada en Class.getName() :

Si este objeto de clase representa un tipo de referencia que no es un tipo de matriz, se devuelve el nombre binario de la clase, tal como lo especifica Java ™ Language Specification, Second Edition .

Si este objeto de clase representa un tipo primitivo o vacío, el nombre devuelto es una String igual a la palabra clave del lenguaje Java correspondiente al tipo primitivo o vacío.

Si este objeto de clase representa una clase de matrices, la forma interna del nombre consiste en el nombre del tipo de elemento precedido por uno o más ''['' caracteres que representan la profundidad de la disposición de la matriz. La codificación de los nombres de los tipos de elementos es la siguiente:

Element Type Encoding boolean Z byte B char C class or interface Lclassname; double D float F int I long J short S

Estoy tratando de localizar una fuga de memoria en un proceso de Java, usando jmap y jhat . Cada vez que hago esto, veo esas notaciones extrañas para tipos de objetos específicos, como [S para matrices de cadenas y [C para matrices de caracteres. Nunca recuerdo qué significa qué, y es muy difícil googlear esto.

( EDITAR : para probar mi punto, resulta que [S es una matriz de short y [C es una matriz de char)]

¿Alguien quiere hacer una tabla con todos los nombres de las diferentes clases y lo que significan? ¿O señalarme a esa mesa?

Específicamente, me gustaría saber qué [Ljava.lang.Object; medio.


Las reglas se enumeran en el documento API de Class.getName() .

[Ljava.lang.Object; sería una instancia de Object[] . Tenga en cuenta que las matrices multidimensionales se muestran con múltiples llaves de apertura.


Objeto de medios []


es una matriz de objetos especificada por las especificaciones JVM para la representación interna de nombres de clase:

  • un solo [significa una serie de
  • L seguido de un nombre de clase totalmente calificado (por ejemplo, java / lang / Object) es el nombre de la clase terminado por punto y coma;

entonces [Ljava.lang.object; significa Objeto []