是否有可能在Java中有多个堆?

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

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

通常有;

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

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

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

由于Java虚拟机实例中只有一个堆,因此需要多个JVM来实现多个堆

Java虚拟机体系结构 – 您可以看到区域只是Java虚拟机中的一个

在此处输入图像描述

参考JVM Internals的链接