JVM是否在达到-Xmx限制时强制进行垃圾回收?

Sim*_*eon 10 java garbage-collection memory-management

问题基本上包含在标题中.

假设您的应用程序已达到其JVM -Xmx限制.当该应用程序需要更多内存时,是否强制进行垃 (在HotSpot JVM中)

我无法解释的第二个奇怪的事情是,我目前有一个运行-Xmx = 2048m的应用服务器,"top"命令(在linux上)为其进程报告2.7g.

那么应用程序如何/何时允许超过其-Xmx?

谢谢,

Tom*_*icz 11

实际上,当年轻代已满(不是整个堆)时会触发正常的GC,并且当幸存者空间中没有剩余空间时会触发主要GC,因此需要将某些对象迁移到旧代.

  • `-Xmx`仅设置最大堆大小.这通常是最大的区域,但不是唯一的区域.你有线程堆栈,直接内存,共享库,JVM本身等. (3认同)
  • +1:通常完整的终身空间是触发Full GC的原因.次要集合通常通过在此之前将对象移动到终身空间来避免幸存者空间填充. (2认同)

Fre*_* LS 7

Xmx参数仅指定堆的大小.Java进程占用更多内存,因为堆只是Java进程的一部分,我想你还有其他java进程包含的内容,如本机库,perm gen以及应用程序生成的本机内存分配.

这是一篇描述内存分配的好文章:http: //www.ibm.com/developerworks/java/library/j-nativememory-linux/


Phi*_*ler 5

是的,如果 JVM 达到堆限制(并且可能更快),它肯定会调用 GC。如果这没有帮助,它将抛出OutOfMemoryErrors。

您看到更大进程内存消耗的原因是该-Xmx选项仅限制 Java 堆空间(Java 对象分配的位置)。JVM 还使用了其他几个内存区域:线程堆栈空间、“永久代”(存储类及其代码的地方)、通过 分配的“直接”内存ByteBuffers、由本机库分配的内存等。对于某些这些额外的内存区域存在其他允许限制它们的配置选项,例如-Xss,但有些甚至不受 JVM 的控制。