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

时间:2014-12-18 09:22:37

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

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

2 个答案:

答案 0 :(得分:8)

已经存在多个内存区域,但只有一个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必须存在才能工作。

答案 1 :(得分:1)

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

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

enter image description here

refer link for JVM Internals