java堆转储中那些奇怪的类名是啥意思?
Posted
技术标签:
【中文标题】java堆转储中那些奇怪的类名是啥意思?【英文标题】:What do those strange class names in a java heap dump mean?java堆转储中那些奇怪的类名是什么意思? 【发布时间】:2010-11-08 09:36:51 【问题描述】:我正在尝试使用jmap 和jhat 追踪Java 进程中的内存泄漏。每次我这样做时,我都会看到那些用于特定对象类型的奇怪符号,例如用于字符串数组的[S
和用于字符数组的[C
。我不记得是什么意思,而且很难用谷歌搜索这些东西。
(编辑:为了证明我的观点,事实证明[S
是短数组,[C
是字符数组。)
有人愿意制作一张表格,列出所有不同的类名及其含义吗?或者指点我这张桌子?
具体来说,我想知道[Ljava.lang.Object;
是什么意思。
【问题讨论】:
字符串数组应该是 [Ljava/lang/String;. 在我的辩护中,谷歌搜索将我带到 java.sun.com 上的一篇文章,其中包含以下内容:“字符串和字符数组对象,[S 和 [C,总是高这个清单”。有点误导。 这个网站也有一些不错的信息:communities.ca.com/web/ca-wily-global-user-community/wiki/-/… 此链接已损坏。我讨厌发布链接,但我会发布上一条评论的更新链接 - communities.ca.com/docs/DOC-99575135。 【参考方案1】:您将在Class.getName() 下找到完整列表:
如果这个类对象代表一个 不是数组的引用类型 然后输入类的二进制名称 返回,由 Java™ 指定 语言规范,第二 版本。
如果这个类对象代表一个 原始类型或 void,然后是名称 返回的
String
等于 Java 对应的语言关键字 原始类型或 void。如果这个类对象代表一个 数组类,然后是内部 名称的形式由名称组成 元素类型的前面有一个或 更多的 '[' 字符代表 数组嵌套的深度。这 元素类型名称的编码为 如下:
元素类型编码 布尔 Z 字节 B 字符 C 类或接口 L类名; 双D 浮动 F 诠释我 长J 短裤
【讨论】:
【参考方案2】:它是由JVM Specifications 指定的对象数组,用于类名的内部表示:
单个 [ 表示 一组 L 后跟一个完全限定的类名(例如 java/lang/Object)是 类名,以分号结尾;所以 [Ljava.lang.object; 表示 Object[]
【讨论】:
第 4.3.2 节可能是更好的参考。 那个链接实际上并没有描述 Class.getName() 使用的约定——事实上,内部命名表示是完全不同的 此外内部命名与Class.getName()相同,只需将/替换为. 我看到了这个:org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Lj ava/lang/Object;Ljava/lang/Throwable;)V
-- “IL”是什么意思?与该签名紧密匹配的方法是log(Marker, String, int, String, Object[], Throwable)
,原语不被分号分隔吗?【参考方案3】:
规则列在Class.getName()的API文档中。
[Ljava.lang.Object;
将是Object[]
的一个实例。注意多维数组
显示时带有多个左大括号。
【讨论】:
【参考方案4】:表示对象[]
【讨论】:
以上是关于java堆转储中那些奇怪的类名是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章