是否有可能在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的链接