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

调查垃圾收集周期原因

阎坚成
2023-03-14

在生产环境中运行的当前基于BPM的应用程序(在JBOSS中作为4.2.3部署)中,注意到了一些性能问题,这是因为在峰值负载期间运行的GC暂停周期较长。通过进一步分析,我发现运行JVM实例的jstat实用程序有以下输出。

/usr/jdk1.6.0-x64/bin/jstat-gccapacity 5583 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 838848.0 1677696.0 1677696.0 167744.0 1342208.0 3355456.0 6710912.0 6710912.0 6710912.0 21248.0 524288.0 480084.0 480084.0 8448 268

/usr/jdk1.6.0-x64/bin/jstat-gcutil 5583 1s S0 S1 E O P YGC YGCT FGC FGC FGCT GCT 0.00 46.33 23.11 81.23 60.38 8451 1386.335 268 159.553 1545.887 0.00 46.33 27.99 81.23 60.38 8451 1386.335 268 159.553 1545.887

在第一个命令中,(使用选项-gccapacity),我观察到,NGC=NGCMX和OGC=OGCMX。也就是说,当前旧发电容量达到最大旧发电容量,当前新发电容量达到最大新发电容量。

我想了解一下,这可能是一些大执行频繁GC循环的原因吗(有时需要25-30秒以上)?

对于当前的解决方案,我们将最大JVM堆内存从8GB增加到9GB。然而,我们需要了解可能的原因,以便我们能够向开发人员团队提出同样的问题,以优化应用程序。

共有2个答案

单于煌
2023-03-14

如果您关心的是GC,也许您可以尝试使用另一种GC算法,甚至是两者的组合。您描述的场景看起来确实不适合您的需要。

算法并行收集器(可以使用-XX:usepallelgc启用)可以并行运行次要收集。警告:此算法是“停止世界”算法,但可以使用多个处理器来执行GC。

还有一个-XX:usepalleloldgc,它为旧版本启用了收集器。

这些算法从一个虚拟机转换到另一个虚拟机。因此,请查看您使用的JVM版本,并尝试根据您的需要选择正确的算法。

正如Peter在回答中所说,分析器将帮助您评估您的应用程序、选择的GC算法并做出决定。

施弘壮
2023-03-14

如果你想了解内存使用的原因,我建议你使用内存分析器。一种选择是使用VisualVM,然而像YourKit这样的商用探查器可能更好地处理更大的内存大小。

从8 GB增加到9 GB不太可能有什么不同。如果你有内存,试试16 GB或30 GB,看看这是否比你需要的多,然后减少它。

如果您无法在生产环境中分析您的应用程序并且测试不能重现相同的行为,您可以使用jmap-histo来了解最大的内存消费者。有时这会给你一个线索。

 类似资料:
  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner

  • 我遇到了一个JNI程序随机内存不足的问题。 这是一个32位java程序,它读取文件,进行一些图像处理,通常使用250MB到1GB。然后丢弃所有这些对象,然后程序对通常需要100-250MB的JNI程序进行一系列调用。 当交互运行时,我从未见过问题。但是,当对许多文件连续运行批处理操作时,JNI程序将随机运行内存溢出。它可能对一个或两个文件有内存问题,然后对下一个10个文件运行正常,然后再次出现故障

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。 而在C 和C++之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问题的一个根源。在编写JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其

  • 问题内容: 我想向JVM注册一个回调,所以我知道何时进行垃圾回收。有什么办法吗? 编辑:我想这样做,以便可以在应用程序日志中发生垃圾收集时注销,这样我就可以查看它是否与我所看到的问题相关。启用- Xloggc很有帮助,但是将GC日志中的时间(自应用程序启动以来使用秒数)整合到我的主应用程序日志中有点棘手。 编辑2012年4月:从Java7u4开始,您可以从GarbageCollectorMXBea

  • 问题内容: 您可以简单地通过调用Java来进行垃圾回收,但有时这会使应用程序“停滞”。这样垃圾收集并避免停顿是一个坏主意: 还是可能导致更多问题? 问题答案: 是的,在大多数情况下,调用System.gc()是一个非常糟糕的主意。有例外,但例外很少,最好花一些时间来确保自己不会在GC环境中做会损害性能的事情,并且学习并确保自己了解gc的工作方式比尝试自己处理它要好得多。显式调用System.gc(