java中可以有多个堆吗?如果可能的话,那么在什么情况下会发生呢?
已经存在多个内存区域,但只有一个 Java 堆。
通常有;
- Java heap which might be broken into
- 用于小型直接内存分配的本机内存堆。例如
ByteBuffer.allocateDirect(4)
See /proc/pid/maps 中缺少 [heap] 部分 https://stackoverflow.com/questions/17782536/missing-heap-section-in-proc-pid-maps进行有趣的讨论[heap]
原生空间中的区域。
- 用于大型直接分配的匿名内存映射。
ByteBuffer.allocateDirect(10000000)
- 线程的堆栈空间。即方法中的局部变量。
- 用于代码的 Perm Gen 或 MetaSpace。字节码和 JIT 编译后的代码在哪里
- 本机代码的共享库。这包括 DLL/SO 以及为什么“hello world”似乎使用如此多的内存。
- 内存映射文件区域。例如文件通道.map(..)
- 其他区域很少直接使用,例如VDSO。只能通过 JNI 或 Unsafe 访问。
当您说“堆”时,这是指第一个堆,您可以自然地在其上分配 Java 对象并由垃圾收集器管理的堆。实际上,还存在本机“堆”,但这不可互换并且具有非常不同的目的,事实上大多数 Java 开发人员永远不需要知道它的存在。
注意:这就是 JVM 在 Windows 和 Linux 上的实现方式,标准中没有任何内容表明 Java 必须存在这些才能工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)