What do those strange class names in a java heap dump mean?
Solution 1
You'll find the complete list documented under Class.getName():
If this class object represents a reference type that is not an array type then the binary name of the class is returned, as specified by the Java™ Language Specification, Second Edition.
If this class object represents a primitive type or void, then the name returned is a
String
equal to the Java language keyword corresponding to the primitive type or void.If this class object represents a class of arrays, then the internal form of the name consists of the name of the element type preceded by one or more '[' characters representing the depth of the array nesting. The encoding of element type names is as follows:
Element Type Encoding boolean Z byte B char C class or interface Lclassname; double D float F int I long J short S
Solution 2
it is an array of objects as specified by JVM Specifications for internal representation of class names:
- a single [ means an array of
- L followed by a fully qualified class name (e.g. java/lang/Object) is the class name terminated by semicolon ;
so [Ljava.lang.object; means Object[]
Solution 3
The rules are listed in the API doc of Class.getName().
[Ljava.lang.Object;
would be an instance of Object[]
. Note that multidimensional arrays
are displayed with multiple opening braces.
itsadok
Updated on June 15, 2022Comments
-
itsadok about 2 years
I'm trying to track down a memory leak in a java process, using jmap and jhat. Every time I do this I see those weird notation for specific object types, like
[S
for string arrays and[C
for Character arrays. I never remember what means what, and it's very hard to google this stuff.(EDIT: to prove my point, it turns out that
[S
is array of short and[C
is array of char.)Anyone care to make a table listing all the different class names and what they mean? Or point me to such table?
Specifically I'd like to know what
[Ljava.lang.Object;
means. -
Brett almost 15 yearsSection 4.3.2 is probably a better reference.
-
dfa almost 15 yearsfurthermore the internal naming is same of Class.getName(), just replace / with .
-
Neil about 12 yearsI saw this:
org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Lj ava/lang/Object;Ljava/lang/Throwable;)V
-- What does "IL" mean? The methods that closely match that signature arelog(Marker, String, int, String, Object[], Throwable)
, do primitives not get separated by semi-colon?