我如何理解垃圾频繁收集的原因?

时间:2020-08-06 07:10:40

标签: java garbage-collection jvm

jstat -gc 27539
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
901632.0 468480.0  0.0    0.0   911360.0 911360.0 5464064.0  5463748.3  21632.0 20948.0 2944.0 2777.7    153   33.727  401   782.598  816.325

jstat -gccapacity 27539
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
171008.0 2732032.0 2714624.0 901632.0 468480.0 911360.0   343040.0  5464064.0  5464064.0  5464064.0      0.0 1069056.0  21632.0      0.0 1048576.0   2944.0    153   404

我添加了EUOU来查找使用的总堆。看起来使用了6GB。我提到了this

但是发生了400多个FGC。现在已经达到700多个。一段时间后,它仅执行GC。现在是850 +。

我的工作:

这是多线程。 100个读者,100个作家线程。每个数据库都有其自己的连接。每个读取器线程读取100000条记录并存储在LinkedList中,然后发送到写入器线程。 Writer将数据写入同一数据库中的另一个集合。 LinkedList不会重复使用,这意味着每个1L都会创建一个新的LinkedList。

它是基于akka的多线程。所以我不处理线程失败,线程生成即线程管理。

但是我的疑问是,当我拥有32GB RAM时,为什么会发生如此巨大的FGC?有什么指针需要进一步看吗?

有时会遇到GC Overhead LIMIt超出错误。

我没有为工作设置任何明确的最小,最大内存。

编辑:

根据我的分析,它已经修复了一些EUOU。它已满,因此继续执行GC。有可能吗,我正确吗?

Edit2

感谢@ emotionlessbanans,@ Cascader。我有以下内容。

    uintx ErgoHeapSizeLimit                         = 0                                   {product}
    uintx HeapSizePerGCThread                       = 87241520                            {product}
    uintx InitialHeapSize                          := 526385152                           {product}
    uintx LargePageHeapSizeThreshold                = 134217728                           {product}
    uintx MaxHeapSize                              := 8392802304                          {product}
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)

我有8gb时,只有6GB停止的任何特定原因吗?还是我错过了什么?

2 个答案:

答案 0 :(得分:3)

当使用-Xmx开关未指定最大堆大小时,JVM将选择一个默认值。此值是JVM供应商特定的,通常取决于体系结构(32/64位)和总可用内存。

您的应用程序似乎使用了所有分配的内存(由JVM确定的内存),从某个角度看,它在GC上花费了太多时间,直到收到“超出GC开销限制”错误为止。

您应明确设置最大堆大小(即-Xmx 10g),以确保您利用了所有可用内存。

答案 1 :(得分:0)

未指定默认的最小内存,最大为256Mb。分配给堆的内存不足可能是个问题。 (这是我的怀疑)

您还可以使用VisualVM或其他任何可以显示有关在那里发生的情况的更多信息的工具。

相关问题