问题基本上包含在标题中。
假设您的应用程序已达到其JVM -Xmx限制。当该应用程序需要更多内存时,是否强制进行垃(在HotSpot JVM中)
我无法解释的第二个奇怪的事情是我目前有一个运行-Xmx = 2048m的应用服务器,“top”命令(在Linux上)为其进程报告2.7g。
那么应用程序如何/何时允许超过其-Xmx?
谢谢,
答案 0 :(得分:11)
实际上,当年轻代已满(不是整个堆)时会触发普通GC,并且当幸存者空间中没有剩余空间时会触发主要GC,因此需要将某些对象迁移到旧代。
答案 1 :(得分:7)
Xmx参数仅指定堆的大小。 Java进程占用更多内存,因为堆只是Java进程的一部分,我想你还有其他java进程包含的内容,如本机库,perm gen以及应用程序生成的本机内存分配。
这是一篇描述内存分配的好文章: http://www.ibm.com/developerworks/java/library/j-nativememory-linux/
答案 2 :(得分:4)
是的,如果它达到堆限制(并且可能更早),JVM肯定会调用GC。如果这没有帮助,它将抛出OutOfMemoryError
s。
您看到更大的进程内存消耗的原因是-Xmx
选项仅限制Java堆空间(分配Java对象的位置)。此外,JVM还使用了其他几个内存区域:Thread堆栈的空间,“PermGen”(存储类及其代码的位置),通过ByteBuffers
分配的“直接”内存,本机库分配的内存,对于其中一些额外的内存区域,存在其他允许限制它们的配置选项,例如-Xss
,但有些甚至无法控制JVM。
答案 3 :(得分:3)
通常就是这种情况,但通常会更快地触发GC,具体取决于您使用的垃圾收集器。
答案 4 :(得分:1)
是的,如果您仍然没有找到内存,则会引发OutOfmemory Error。我理解这样。
答案 5 :(得分:1)
IIRC保证在抛出OutOfMemoryError
之前将执行完整的GC。由于超出堆大小限制必须导致这样的错误,这意味着当达到限制时,您将始终至少有一个完整的GC运行。
答案 6 :(得分:0)
垃圾收集是一个相当大的领域,但你说的对于完整的集合是正确的(还有其他类型)
需要注意的一点是-Xmx设置了最大堆大小,但也有一个-Xms,即最小堆大小。您的应用程序可能仅以最低配置开始。然后,如果使用的内存达到该值,它将触发完整的垃圾收集并增加可用堆的数量,从最小值(-Xmx)到某个值小于或等于最大值(-Xmx)。这可能会发生几次,直到达到最大值。之后,它不再增加堆,但是当达到最大值时,垃圾收集将继续发生。