【问题标题】:'Shared Object Memory' vs 'Heap Memory' - Java“共享对象内存”与“堆内存” - Java
【发布时间】:2011-10-14 20:51:19
【问题描述】:

Java 中的“共享对象内存”和“堆内存”有什么区别。是不是“共享对象内存”是“堆内存”的超集?

这个问题的来源是 jmap 的文档。它提供了打印“共享对象内存”和“堆内存”的不同选项。

【问题讨论】:

  • 我建议你尝试运行它。
  • jmap 文档说“当不使用任何选项时,jmap 打印共享对象映射”。您可以在没有选项的情况下运行 jmap 吗?对我来说,它只是打印使用说明(运行“jmap pid”时)。
  • 如果你使用JDK6,jmap forums.oracle.com/forums/…有一个bug。不带选项 jn JDK6 的 Jmap 的行为类似于 jmap -heap
  • 添加到 Irony,在 google 'Shared Object Memory' + Java 上,几乎所有的链接都显示解释 jmap。 Sun/Oracle 曾在“著名”工具中使用过该术语,但忘记解释该术语。

标签: java performance shared-memory jmap pmap


【解决方案1】:

Java 内存(最高 Java 8)由 3 部分组成:

  1. 堆内存。
  2. 非堆内存 (PermGen)。
  3. 其他内存(JVM 自己的结构)。

所有类实例的内存都是从堆中分配的。 非堆内存主要由 ClassLoaders 用于存储类相关数据。

关于共享对象的一些细节在这里:what is shared objects file?

【讨论】:

    【解决方案2】:

    共享对象内存是经常访问的 java 库类被内存映射的地方,因此它们的加载速度比从 rt.jar 加载快。这包括许多常用的类,如ComparableStringObject 等。如果请求的类文件在共享对象内存中不可用,则从 rt.jar 请求。可以认为是缓存各种java程序中常用的类。

    【讨论】:

      【解决方案3】:

      从我目前的分析来看:

      默认选项将打印所有内存信息,包括:

      • 堆内存
      • 烫发
      • 其他内存(包括 JNI、堆栈空间等)

      这个分析如果基于以下几点:

      在 JDK 文档中提到默认选项(即“共享对象内存”)类似于 Solaris 的 pmap 命令。查看 pmap 命令,它似乎打印了完整的内存信息。

      请添加 cmets 以验证此理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-21
        • 2014-10-08
        • 1970-01-01
        • 2021-12-04
        • 2016-06-22
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多