【问题标题】:Is it possible to have multiple heaps in java?java中是否可以有多个堆?
【发布时间】:2015-02-17 00:48:41
【问题描述】:

java 中是否可以有多个堆?如果有可能,那么在哪些情况下会发生?

【问题讨论】:

  • 我只是想知道 - 为什么?也许您可以通过多个 jvm 来完成此操作。
  • JVM 规范规定每个运行的 JVM 实例应该有一个堆。多个堆是什么意思?...您可以更改 JVM 的堆大小..
  • 那么单个jvm不可能有2个堆?
  • 答案已经是它总是被提及的方式:堆,而不是“堆”。
  • 你能说出你想要完成什么吗?

标签: java memory memory-management garbage-collection heap-memory


【解决方案1】:

已经有多个内存区域,但只有一个 Java 堆。

通常有;

  • Java 堆可能被分解成
    • 伊甸空间,
    • 幸存者空间,
    • 任期空间。
  • 用于小型直接内存分配的本机内存堆。例如ByteBuffer.allocateDirect(4) 请参阅 missing [heap] section in /proc/pid/maps,了解有关原生空间中 [heap] 区域的有趣讨论。
  • 用于大型直接分配的匿名内存映射。 ByteBuffer.allocateDirect(10000000)
  • 线程的堆栈空间。即方法中的局部变量。
  • 代码的 Perm Gen 或 MetaSpace。字节码和 JIT 编译的代码在哪里
  • 本机代码的共享库。这包括 DLL/SO 以及为什么“hello world”似乎使用了这么多内存。
  • 内存映射文件区域。例如FileChannel.map(..)
  • 其他很少直接使用的区域,例如 VDSO。只能通过 JNI 或 Unsafe 访问。

当您说“堆”时,这是指第一个堆,即您可以自然地在其上分配 Java 对象并由垃圾收集器管理的堆。实际上,还有本机“堆”,但它不可互换并且用途非常不同,事实上大多数 Java 开发人员永远不需要知道它的存在。

注意:这是 JVM 在 Windows 和 Linux 上的实现方式,标准中没有任何内容说 Java 必须存在这些才能工作。

【讨论】:

    【解决方案2】:

    由于Java虚拟机实例中只有一个堆,所以多个堆需要多个JVM's

    Java 虚拟机架构 - 你可以看到 Heap 区域只是 Java 虚拟机中的一个

    refer link for JVM Internals

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2018-08-18
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多