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

4

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


2
我只是在想 - 为什么?也许你可以通过多个JVM来完成这个任务。 - vikingsteve
JVM规范指定每个正在运行的JVM实例应该有一个堆。多个堆是什么意思?..您可以更改JVM的堆大小.. - TheLostMind
那么在一个JVM中使用两个堆是不可能的吗? - Marcin Szymczak
1
答案已经在它被引用的方式中了:是“THE heap”,而不是“a heap”。 - Gimby
2
你能告诉我你想要实现什么吗? - Panther
两个词,不和没有。 - user207421
2个回答

10

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

通常有以下几种:

  • Java堆,可能分为
    • 伊甸园空间,
    • 幸存者空间,
    • 年老代空间。
  • 用于小的直接内存分配的本机内存堆。例如ByteBuffer.allocateDirect(4)。有关本机空间中[heap]区域的有趣讨论,请参见在/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必须依赖这些。


4

由于 Java 虚拟机实例内只有一个堆,所以需要多个 JVM 来获得多个堆。

Java 虚拟机体系结构 - 可以看到 Java 虚拟机中 区域仅有一个。

enter image description here

参考链接了解 JVM 内部结构


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接