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

JVM堆使用百分比-何时生成警报

龙嘉誉
2023-03-14

我们有一个部署在Tomcat8应用服务器上的应用程序,当前监控服务器(Zabbix)被配置为在堆内存利用率达到90%时生成警报。

生成了某些警报,提示我们进行堆转储分析。没有真正从堆转储出来的东西,没有内存泄漏。由于没有GC,有很多无法到达的对象没有被清理掉。

JVM配置:

-Xms8192m -Xmx8192m -XX:PermSize=128M -XX:MaxPermSize=256m 
-XX:+UseParallelGC -XX:NewRatio=3 -XX:+PrintGCDetails 
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/apache-tomcat-8.0.33 
-XX:ParallelGCThreads=2 
-Xloggc:/app/apache-tomcat-8.0.33/logs/gc.log 
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
-XX:+PrintGCTimeStamps -XX:GCLogFileSize=50m -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=30

我们尝试使用jcmd命令手动运行垃圾回收,它清理了内存。运行jcmd后的GC日志:

2016-11-04T03:06:31.751-0400: 1974627.198: [Full GC (System.gc()) [PSYoungGen: 18528K->0K(2049024K)] [ParOldGen: 5750601K->25745K(6291456K)] 5769129K->25745K(8340480K), [Metaspace: 21786K->21592K(1069056K)], 0.1337369 secs] [Times: user=0.19 sys=0.00, real=0.14 secs]

问题:

  1. 上面是否有任何配置导致GC无法自动运行。
  2. 这种行为的原因是什么?我知道Java会在需要的时候做GC。但是,如果在堆利用率为90%的情况下仍未运行GC,那么警报阈值应该是多少(以及是否有必要根据堆利用率发出警报)。

共有1个答案

皇甫学海
2023-03-14

当垃圾回收器决定每个垃圾回收器收集不同的数据时。我没有找到任何关于你的(并行GC)垃圾回收器何时运行的硬性承诺。许多垃圾收集器还会调优几个不同的变量,这会影响它何时运行。

正如您自己所注意到的,您的应用程序可以有很高的堆使用率,并且仍然运行良好。您在应用程序中寻找的是垃圾回收器仍然是高效的。这意味着它可以在一次运行中清理大量的垃圾。

大多数垃圾收集器有两个或更多的策略,一个用于‘年轻’对象,一个用于‘老’对象。当一个年轻的物体还没有在最近的(几个)收藏中被收藏时,它就变成了一个老物体。这背后的想法是,如果一个对象没有被收集,那么下一次可能也不会被收集。(大多数物体要么活得很短,要么活得很长)。垃圾收集器对年轻对象的清理非常有效,但并不完美。如果没有释放出足够的数据,那么将对所有(年轻的或老的)对象进行代价更高的垃圾收集。

这导致您在确定应用程序的运行状况时可以查看以下方面:

  1. 应用程序垃圾收集所花费的时间(总计和占CPU时间的百分比)。
  2. 垃圾收集后可用的内存量。
  3. 大型垃圾收集数量的快速增加。

在大多数情况下,您将需要监视应用程序在负载下的行为,以查看哪些是适合您的值。

并行垃圾回收器使用类似的条件来确定是否一切正常:

如果总时间的98%以上用于垃圾回收,而恢复的堆不到2%,则抛出OutOfMemoryError。

使用VisualVM和JConsole可以很好地看到所有这些统计信息。我不确定您可以在监视工具中使用哪种触发器

 类似资料:
  • Highcharts 柱形图 以下实例演示了使用百分比的堆叠柱形图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。在 plotOptions 中添加 stacking 属性: 配置 plotOptions:数据点选项 plotOptions用于设置图表中的数据点相关属性。plotOptions根据各种图表类型,其属性设置略微有些差异。 配置图表堆叠

  • Highcharts 区域图 以下实例演示了百分比堆叠区域图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。在 plotOptions 中添加 stacking 属性: 配置 plotOptions:数据点选项 plotOptions用于设置图表中的数据点相关属性。plotOptions根据各种图表类型,其属性设置略微有些差异。 配置图表堆叠设置

  • 我们的一个sap系统(PI ABAP JAVA stack)出现了性能问题。为机器配置的整个64GB都被占用了(还有8个内核)。每个人都在怀疑java部分,但我认为不同。 重启内存不足错误的java服务器节点。查看hprof文件,我发现当为服务器节点配置3GB(-Xms和Xmx)堆时,它们的大小只有1.2G(3个服务器节点的平均大小)。这一观察导致以下疑问。 我读到过,当Xms和Xmx设置为相同的

  • 以下是带有百分比的堆积柱形图的示例。 我们已经在Highcharts Configuration Syntax一章中看到了用于绘制图表的配置 。 现在让我们看一下其他配置,以及我们如何在plotoptions添加plotoptions属性。 下面给出了具有百分比的堆积柱图的示例。 plotOptions plotOptions是每个系列类型的配置对象的包装对象。 还可以为系列数组中给出的每个系列项

  • 以下是具有百分比的堆积柱形图的示例。 我们已经在Highcharts Configuration Syntax一章中看到了用于绘制图表的配置 。 现在让我们看一下其他配置,以及我们如何在plotoptions中添加stack属性。 下面给出了具有百分比的堆积柱形图的示例。 plotOptions plotOptions是每个系列类型的配置对象的包装对象。 还可以为系列数组中给出的每个系列项覆盖每个

  • 这5个国家在所有奥运会上获得的奖牌中,每个国家获得的奖牌比例是多少?