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
我添加了EU
和OU
来查找使用的总堆。看起来使用了6GB。我提到了this
但是发生了400多个FGC。现在已经达到700多个。一段时间后,它仅执行GC。现在是850 +。
我的工作:
这是多线程。 100个读者,100个作家线程。每个数据库都有其自己的连接。每个读取器线程读取100000条记录并存储在LinkedList
中,然后发送到写入器线程。 Writer
将数据写入同一数据库中的另一个集合。 LinkedList不会重复使用,这意味着每个1L都会创建一个新的LinkedList。
它是基于akka
的多线程。所以我不处理线程失败,线程生成即线程管理。
但是我的疑问是,当我拥有32GB RAM时,为什么会发生如此巨大的FGC?有什么指针需要进一步看吗?
有时会遇到GC Overhead LIMIt超出错误。
我没有为工作设置任何明确的最小,最大内存。
编辑:
根据我的分析,它已经修复了一些EU
和OU
。它已满,因此继续执行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停止的任何特定原因吗?还是我错过了什么?
答案 0 :(得分:3)
当使用-Xmx
开关未指定最大堆大小时,JVM将选择一个默认值。此值是JVM供应商特定的,通常取决于体系结构(32/64位)和总可用内存。
您的应用程序似乎使用了所有分配的内存(由JVM确定的内存),从某个角度看,它在GC上花费了太多时间,直到收到“超出GC开销限制”错误为止。
您应明确设置最大堆大小(即-Xmx 10g
),以确保您利用了所有可用内存。
答案 1 :(得分:0)
未指定默认的最小内存,最大为256Mb。分配给堆的内存不足可能是个问题。 (这是我的怀疑)
您还可以使用VisualVM或其他任何可以显示有关在那里发生的情况的更多信息的工具。