2009-07-06 8 views
31

Ich versuche, einen Speicherverlust in einem Java-Prozess zu finden, mit jmap und jhat. Jedes Mal, wenn ich das mache, sehe ich diese merkwürdige Notation für bestimmte Objekttypen, wie [S für String-Arrays und [C für Zeichen-Arrays. Ich erinnere mich nie, was was bedeutet, und es ist sehr schwer, dieses Zeug zu googeln.Was bedeuten diese seltsamen Klassennamen in einem Java-Heap-Dump?

(EDIT: mein Punkt zu beweisen, es stellt sich heraus, dass [S Reihe von kurzen und [C ist Array von char.)

irgendwen eine Tabelle, die alle verschiedenen Klassennamen Auflistung zu machen und was sie bedeuten? Oder zeigst du mich auf einen solchen Tisch?

Speziell würde ich gerne wissen, was [Ljava.lang.Object; bedeutet.

+0

Array von String sein sollte _ [Ljava/lang/String; _. –

+0

Zu meiner Verteidigung führte mich das Googlen zu einem Artikel auf java.sun.com, der diese Zeile enthält: "Die Array-Objekte String und Character, [S und [C, werden auf dieser Liste immer ganz oben stehen. Etwas irreführend. – itsadok

+0

Diese Seite hat auch einige gute Informationen: https://communities.ca.com/web/ca-wily-global-user-community/wiki/-/wiki/Main/JNI+Signatures/contactLink – masterxilo

Antwort

55

Sie finden die vollständige Liste finden Sie unter Class.getName() dokumentiert:

Wenn diese Klasse Objekt eine Typenbezeichnung darstellt, die kein Array Typ ist dann der binäre Name der Klasse zurückgegeben wird, wie angegeben durch die Java ™ Sprache Spezifikation, zweite Ausgabe.

Wenn diese Klasse Objekt einen Urtyp oder nichtig darstellt, wurde der Name zurückgegeben wird, ist ein String gleich das Java Sprache Schlüsselwort zum Urtyp oder nichtig entspricht.

Wenn dieses Klassenobjekt eine Klasse von Anordnungen darstellt, dann ist die interne Form des Namens besteht aus dem Namen des Typs Element vorangestellt durch eine oder mehr ‚[‘ Zeichen, die die Tiefe des Arrays Verschachtelung .Die Codierung von Typnamen Element ist als folgt:

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

es ist ein Array von Gegenständen, wie durch JVM Specifications für die interne Darstellung von Klassennamen angegeben:

  • einem einzigen [Mittel ein Array von
  • L durch einen vollständig qualifizierten Klassennamen gefolgt (zB Java/lang/Object) ist der Klassenname mit Semikolon abgeschlossen;

so [Ljava.lang.object; bedeutet Object []

+0

Abschnitt 4.3.2 ist wahrscheinlich eine bessere Referenz. –

+0

dieser Link beschreibt nicht wirklich die Konventionen von Class.getName() verwendet - in der Tat ist die interne Benennung Darstellung ganz anders – kdgregory

+0

Class.getName() wird nie von itsadok zitiert ... – dfa

5

Die Regeln in der API doc von Class.getName() aufgeführt sind.

[Ljava.lang.Object; wäre eine Instanz von Object[]. Beachten Sie, dass mehrdimensionale Arrays mit mehreren öffnenden geschweiften Klammern angezeigt werden.