例如,我将-Xmx设置为40G。我希望我的java处理器不会使用超过40G。
我的程序在cms-gc上运行得很好。
但是,当我使用相同内存的G1 gc时(甚至增加15%的内存)。
它总是被奥姆杀手杀死。
我找到了一篇这样的文章:为什么我的Java进程比Xmx占用更多的内存?
它表示:
G1 is especially known for its
excessive appetite for additional memory, so be aware of this.所以我想知道,如何限制g1 gc使用的内存,以及为什么g1使用这么多额外内存?
发布于 2019-07-02 08:11:32
您提到的那篇文章(为什么我的Java进程比Xmx占用更多的内存?)清楚地概述了它。
Java进程需要内存用于以下几个方面:
另一个问题是,某些JVM内存不算为permgen内存,无法控制。
因此,如果希望将Java应用程序限制在40 GB以内,则必须考虑所有类型的内存。从较小的值开始,例如:
-Xmx30g -XX:MaxPermSize=1g -Xss1m然后观察进程的内存使用情况,如果进程安全地远离目标40 if,则增加Xmx。
发布于 2020-05-21 23:50:23
您不能限制G1需要使用什么。如果可以的话--您会破坏所有的东西,或者在内存错误的堆中死掉,因为G1将没有资源来正常工作。要解释为什么这个算法需要使用额外的内存,并不简单。它至少需要为card table和remembered sets、这就是为什么提供空间内存。它需要SATB队列的内存,当GC循环处于活动状态时,这些是“拦截”堆写入和读取的数据结构。我敢打赌还有更多。通常,如果您希望并发(以便您的应用程序在GC循环处于活动状态时运行),则需要提供更多的内存。
https://stackoverflow.com/questions/56847722
复制相似问题