2009-07-06 13 views
31

J'essaye de traquer une fuite de mémoire dans un processus de Java, en utilisant jmap et jhat. Chaque fois que je fais cela, je vois ces notations bizarres pour des types d'objets spécifiques, comme [S pour les tableaux de chaînes et [C pour les tableaux de caractères. Je ne me souviens jamais de ce que signifie quoi, et c'est très difficile de google google ce genre de choses.Que signifient ces étranges noms de classe dans un vidage de tas Java?

(EDIT: pour prouver mon point, il se trouve que [S est un tableau de court et [C est tableau de char.)

Quelqu'un veut faire un tableau répertoriant tous les différents noms de classe et ce qu'ils signifier? Ou pointez-moi à une telle table?

Plus précisément, j'aimerais savoir ce que [Ljava.lang.Object; moyens.

+0

Tableau de chaîne doit être _ [Ljava/lang/String; _. –

+0

Pour ma défense, googling m'a conduit à un article sur java.sun.com qui contient cette ligne: "Les objets array String et Character, [S et [C, seront toujours en haut de cette liste". Plutôt trompeur. – itsadok

+0

Ce site contient également de bonnes informations: https://communities.ca.com/web/ca-wily-global-user-community/wiki/-/wiki/Main/JNI+Signatures/contactLink – masterxilo

Répondre

55

Vous trouverez la liste complète documentée sous Class.getName():

Si cet objet de classe représente un type de référence qui n'est pas un type tableau alors le nom binaire de la classe est retourné, comme indiqué par le Java ™ Spécification du langage, Seconde Edition.

Si cet objet de classe représente un type primitif ou vide, le nom retourné est un String égal au mot-clé du langage Java correspondant au type primitif ou vide.

Si cet objet de classe représentant une classe de tableaux, la forme interne du nom est composé du nom du type d'élément précédé d'une ou plus « [ » caractères représentant la profondeur de l'imbrication de réseau .Le encodage des noms de type d'élément est comme suit:

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

il est un tableau d'objets tel que spécifié par JVM Specifications pour la représentation interne de noms de classes:

  • un seul moyen [un réseau de
  • L suivi d'un nom de classe complet (par exemple java/lang/Object) est le nom de classe terminé par un point-virgule;

ainsi [Ljava.lang.object; signifie Object []

+0

La section 4.3.2 est probablement une meilleure référence. –

+0

ce lien ne décrit pas réellement les conventions utilisées par Class.getName() - en fait, la représentation de nommage interne est tout à fait différente – kdgregory

+0

Class.getName() n'est jamais cité par itsadok ... – dfa

5

Les règles sont listées dans l'API doc de Class.getName().

[Ljava.lang.Object; serait une instance de Object[]. Notez que les tableaux multidimensionnels sont affichés avec plusieurs accolades d'ouverture.