当前位置: 首页 > 知识库问答 >
问题:

Java 8年轻gc成本超过1s,如何减少新一代gc时间

松和泰
2023-03-14

框架:Spring+mybatis+dubbo+RocketMQ。

下面是JVM参数:

-server-xmx5g-xms5g-xn1g-xx:metaspacesize=512m-xx:maxmetaspacesize=512m-xss256k-xx:survivorratio=8-xx:+printgcdetails-xloggc:/opt/apps/logs/gc.log-xx:+printgcdatestamps-xx:+printgcapplicationstoppedtime-xx:+printsafepointstatistics-xx:printsafepointstatisticscount=1-xx:+printreferencegc

我花了两个星期的时间来研究这个问题,但还是找不出是什么原因造成的。首先,我打开了GC日志和安全点日志,怀疑安全点可能是原因。但是我发现旋转时间+阻挡时间很短。只有年轻gc发生时,vmop时间与年轻gc停止时间几乎相同。

然后检查FinalRefence集合,并添加PrintReferenceGC。也很短。

这是gc日志

共有1个答案

龙博
2023-03-14

从年轻集合之后的剩余堆占用情况可以看出,应用程序的活动集大小(包括年轻和老对象)似乎小于300MB。您的堆总大小为5GB,因此有很多喘息的空间。

而且由于有呼吸的空间和年轻的停顿时间是一个问题,你可以尝试缩小年轻一代,这可能会稍微增加的持续率,但CMS老一代收集器应该能够跟上这一点。

根据您提供的GC日志:

2019-09-20T07:56:55.968+0800: 40869.330: [GC (Allocation Failure) 2019-09-20T07:56:55.969+0800: 40869.331: [ParNew2019-09-20T07:56:56.006+0800: 40869.368: [SoftReference, 0 refs, 0.0000588 secs]2019-09-20T07:56:56.006+0800: 40869.368: [WeakReference, 114 refs, 0.0000369 secs]2019-09-20T07:56:56.006+0800: 40869.368: [FinalReference, 22 refs, 0.0000404 secs]2019-09-20T07:56:56.006+0800: 40869.368: [PhantomReference, 0 refs, 0 refs, 0.0000298 secs]2019-09-20T07:56:56.006+0800: 40869.368: [JNI Weak Reference, 0.0000626 secs]: 842095K->3179K(943744K), 0.0378130 secs] 1170641K->331912K(5138048K), 0.0394628 secs] [Times: user=0.70 sys=0.42, real=0.04 secs] 
2019-09-20T07:58:44.545+0800: 40977.907: [GC (Allocation Failure) 2019-09-20T07:58:44.545+0800: 40977.908: [ParNew2019-09-20T07:58:45.798+0800: 40979.160: [SoftReference, 0 refs, 0.0000641 secs]2019-09-20T07:58:45.798+0800: 40979.160: [WeakReference, 116 refs, 0.0000436 secs]2019-09-20T07:58:45.798+0800: 40979.160: [FinalReference, 14 refs, 0.0000217 secs]2019-09-20T07:58:45.798+0800: 40979.160: [PhantomReference, 0 refs, 0 refs, 0.0000293 secs]2019-09-20T07:58:45.798+0800: 40979.160: [JNI Weak Reference, 0.0000510 secs]: 842091K->3159K(943744K), 1.2526309 secs] 1170824K->331976K(5138048K), 1.2541209 secs] [Times: user=6.73 sys=0.66, real=1.26 secs] 
 类似资料:
  • 这里有我的GC.log的摘录: 2013-02-28T12:02:13.209+0100:1486457.849:[GC 1486457.850:[ParNew 3483368K->96838K(3774912K),0.2273030秒]8085678K->4710336K(49912256K),0.2278070秒][times:user=1.54 sys=0.01,real=0.23秒] 20

  • 我最近发布了一个关于提高内存使用率/GC的问题,并且已经能够使用s将内存消耗降低到我认为是适当/成比例的水平(并且在此过程中从“从未完成”到当前测试的“非常非常慢”),但似乎仍然存在我认为GC时间过多的问题。 在以下输出中分析测试结果: 以及以下堆可视化: 目前,我使用的是H,这似乎很有帮助,并尝试了增加线程、世代、因子和使用压缩(N-G-F-c)的组合,所有这些都没有导致性能的明显变化或降低。很

  • 此图表显示了我们的Java应用程序在4天内的堆利用率(OU欧盟S1U S2U)。每次下降都是一个Young GC事件。正如您可以注意到的,堆使用率有一个增加的模式。完整的GC在运行6天后发生(图表中未显示)。它将堆使用率降低到正常水平,但暂停时间为2分钟,它会导致应用程序下降许多事务。 我们的JRE是8,我们使用并行GC。堆参数如下所示: 我试图了解什么调整是可能的,使年轻GC更有效,以便它删除所

  • 我使用Jmeter将工作负载注入部署在AWS EC2实例上的应用程序。测试必须非常庞大:它持续10个小时,工作负载配置文件具有双峰形状,在5分钟内大约有2600个请求。实际上我有一个m3。部署应用程序的xlarge实例,8 m3。xlarge实例每个实例运行一个jmeter实例。使用python脚本,要注入的工作负载在8个客户机实例之间进行分割,因此在示例中,如果原始工作负载要注入800个请求,那

  • 在Android Studio1.5.1只是通过移动源代码从一个系统到另一个即使干净的构建是成功的,但当代码运行我得到这种错误 java.lang.OutOfMemoryError: GC开销限制超过错误:任务': app: dexDebug'执行失败。 我在应用程序中添加了以下代码。格拉德尔还: