我有一个Java Spring Boot应用程序,它应该长时间运行,并且整个响应时间还
我的服务器是IO密集型的,我们没有在内存中存储任何内容,但是有很多并发IO(每分钟30k rpm),每个IO响应都携带大约3-4MB的数据。从日志中,我观察到次要GC在一秒钟内运行了近3-4次,次要GC经常由于伊甸园和幸存者空间较小(Eden空间为600MB,幸存者空间为75MB)而被频繁触发。由于GC非常频繁,因此这些对象可能幸存于阈值的次要GC(15)中,并被提升为老一代。因此,我通过创建-XX:NewRatio=1来增加年轻一代的空间。

问题仍然存在,我在一秒钟内可以看到3-4次分配失败日志(如下所示)

[GC (Allocation Failure) 56455.997: [ParNew: 10705358K->222390K(11796480K), 0.0467254 secs] 13148872K->2667031K(24903680K), 0.0468292 secs] [Times: user=0.34 sys=0.00, real=0.05 secs]

使用新的文物,我监视了内存,年轻的一代保持不变,而老一代则保持增长,下面是快照。

java - 伊甸园和幸存者保持不变的同时,JVM的老一代不断增长-LMLPHP

我认为,对于我的应用程序来说,一个很好的堆分配策略是,年轻一代会不断被填充和清空,而老一代则几乎没有使用过,因为我们几乎没有长寿的对象。请提出如何实现上述目标,或者您可能想到的任何更好的策略

最佳答案

以下是建议:


大物件阵列等被创造了旧的一代空间。因此,请检查您要创建的大型对象以及它们要停留多长时间。
当满足对象的使用期限阈值时,将对象移动到旧的GC。因此,您可以朝这个方向看。
检查次要和主要GC的执行方式,就像它们正在快速填充或达到将对象移至旧一代时的阈值一样。
如果过小的话,请查看您的伊甸园和幸存者的大小,它们可能会触发主要的gc并导致物体移至旧世代。

关于java - 伊甸园和幸存者保持不变的同时,JVM的老一代不断增长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58692231/

10-10 02:56