Java堆转储中那些奇怪的类名是什么意思?

我正在尝试使用jmapjhat在java进程中跟踪内存泄漏。每次我这样做时,我都会看到特定对象类型的奇怪符号,例如字符串数组和字符数组。我从来不记得这意味着什么,而且很难用谷歌搜索这些东西。[S[C

(编辑:为了证明我的观点,事实证明这是短数组,是char数组。[S[C

有人想做一个列出所有不同类名称及其含义的表格吗?或者指给我这样的桌子?

具体来说,我想知道是什么意思。[Ljava.lang.Object;


答案 1

您将在 Class.getName() 下找到记录的完整列表:

如果此类对象表示的引用类型不是数组类型,则返回该类的二进制名称,如 Java™ 语言规范第二版所指定。

如果此类对象表示基元类型或 void,则返回的名称等于与基元类型或 void 对应的 Java 语言关键字。String

如果此类对象表示数组类,则名称的内部形式由元素类型的名称组成,前面有一个或多个表示数组嵌套深度的“[”字符。元素类型名称的编码如下所示:

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

答案 2

它是 JVM 规范为类名的内部表示而指定的对象数组:

  • 单个 [ 表示
  • L 后跟完全限定的类名(例如.java/lang/Object)是以分号结尾的类名 ;

所以 [Ljava.lang.object; means Object[]