【问题标题】:What do those strange class names in a java heap dump mean?java堆转储中那些奇怪的类名是什么意思?
【发布时间】:2023-04-03 16:32:01
【问题描述】:

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

编辑:为了证明我的观点,事实证明[S 是短数组,[C 是字符数组。)

有人愿意制作一张表格,列出所有不同的类名及其含义吗?或者指点我这张桌子?

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

【问题讨论】:

标签: java debugging memory-leaks heap-memory jmap


【解决方案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】:

      表示对象[]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多