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

Mar*_*zak 1 java memory heap garbage-collection memory-management

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

Pet*_*rey 8

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