Java JVM在达到-Xmx限制时是否强制垃圾收集?

Java JVM在达到-Xmx限制时是否强制垃圾收集?,java,memory-management,garbage-collection,Java,Memory Management,Garbage Collection,这个问题基本上包含在标题中 假设您有一个已达到JVM-Xmx限制的应用程序。当应用程序需要更多内存时,垃圾回收是强制的吗?(在热点JVM中) 第二件我无法解释的奇怪事情是,我目前有一个应用程序服务器,运行时使用-Xmx=2048m,“top”命令(在linux上)报告其进程为2.7g 那么,如何/何时允许应用程序超过其-Xmx 谢谢,是的,如果您仍然找不到内存,它将引发OutOfmemory错误。我是这样理解的。通常情况就是这样,尽管GC通常会触发得更快,这取决于您使用的垃圾收集器。IIRC保证

这个问题基本上包含在标题中

假设您有一个已达到JVM-Xmx限制的应用程序。当应用程序需要更多内存时,垃圾回收是强制的吗?(在热点JVM中)

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

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


谢谢,

是的,如果您仍然找不到内存,它将引发OutOfmemory错误。我是这样理解的。

通常情况就是这样,尽管GC通常会触发得更快,这取决于您使用的垃圾收集器。

IIRC保证在抛出
OutOfMemoryError
之前执行完整的GC。由于超过堆大小限制一定会导致这样的错误,这意味着当达到限制时,您将始终至少运行一次完整的GC。

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

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


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

垃圾收集是一个相当大的区域,但您所说的对于完全收集是正确的(还有其他类型)


需要注意的一点是-Xmx设置了最大堆大小,但是还有一个-Xms,它是最小堆大小。您的应用程序只能从配置的最小值开始。然后,如果使用的内存达到该值,它将触发完全垃圾收集并增加可用堆的数量,从最小值(-Xmx)增加到小于或等于最大值(-Xmx)的某个值。这可能会发生多次,直到达到最大值。在此之后,它不能再增加堆,但当达到最大值时,垃圾收集将继续发生。

Xmx参数只指定堆的大小。Java进程占用更多内存,因为堆只是Java进程的一部分,我猜Java进程还包含其他东西,比如本机库、perm gen以及应用程序进行的本机内存分配

下面是一篇描述内存分配的好文章:

+1:通常,一个完整的终身空间会触发一个完整的GC。次要收集通常通过在发生这种情况之前将对象移动到永久空间来避免幸存者空间填充。
-Xmx
仅设置最大堆大小。这通常是最大的区域,但不是唯一的区域。您有线程堆栈、直接内存、共享库、JVM本身等等。
-Xmx=2048
是2048字节。我想你的意思是
-Xmx=2048m
注意:你可以只写
-mx2g
,这是一样的。@PeterLawrey谢谢,是的,我是说2048m。编辑了这个问题。