例如,我将-Xmx设置为40G。我希望我的Java处理器使用的内存不会超过40G。
我的程序在cms-gc上运行正常。
但是当我使用相同的内存(甚至多15%的内存)切换到G1 gc时。
它总是被oom killer杀死。
我发现了一些类似这样的文章:Why does my Java process consume more memory than Xmx?
它表示:
G1 is especially known for its
excessive appetite for additional memory, so be aware of this.
所以我想知道,如何限制g1 gc使用的内存以及为什么g1使用这么多的额外内存
答案 0 :(得分:0)
您提到的文章(Why does my Java process consume more memory than Xmx?)对其进行了清晰的概述。
Java进程需要内存来做几件事:
另一个问题是,某些JVM内存未计为 permgen 内存,因此无法控制。
因此,如果要将Java应用程序限制为40 GB,则必须考虑所有类型的内存。从较小的值开始,例如:
-Xmx30g -XX:MaxPermSize=1g -Xss1m
然后观察您的进程的内存使用情况,如果该进程安全地远离目标40GB,则增加Xmx
。
答案 1 :(得分:0)
您不能限制G1
需要使用的内容。如果可以-您会破坏一切或死于堆内存不足错误,因为G1没有足够的资源来正常运行。要解释为什么,此算法需要使用额外的内存,这并不简单。它至少需要存储card table
和remembered sets
,here is why的空间。它需要SATB
队列的内存,这些是GC周期处于活动状态时“拦截”堆读写的一些数据结构。我敢打赌,还有更多。通常,如果要并发(以便在GC周期处于活动状态时运行应用程序),则需要提供更多的内存。