我如何理解频繁进行垃圾回收的原因?

20 浏览
0 Comments

我如何理解频繁进行垃圾回收的原因?

我添加了EUOU来查找堆使用的总量。看起来使用了6GB。我参考了这个。\n但是已经发生了400+次FGC。现在已经达到了700+。过了一段时间后,它只执行GC。现在已经是850+了。\n我的工作:\n这是多线程的,有100个读取器线程和100个写入器线程。每个线程都有自己连接到数据库。每个读取器线程读取100000条记录并存储在一个LinkedList中,并发送给写入器线程。写入器将数据写入同一数据库中的另一个集合。LinkedList没有被重用,意味着每1L都创建一个新的LinkedList。\n这是基于akka的多线程。所以我不处理线程故障、线程生成等线程管理工作。\n但是我想知道为什么在我有32GB内存的情况下会发生如此大量的FGC?有没有进一步的指导?\n有时会遇到GC超过限制的错误。\n我没有为任务设置任何明确的最小和最大内存。\n编辑:\n根据我的分析,它已经修复了一些EUOU。它是满的,因此一直在执行GC。这可能吗,我是正确的吗?\n编辑2:\n感谢@emotionlessbanans,@Cascader。我有以下内容。\n

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)

\n当我有8GB内存时,为什么只停在6GB?还是我漏掉了什么?

0
0 Comments

出现的原因:默认的最小内存没有指定,最大内存为256MB,可能是堆分配的内存不足引起的问题。

解决方法:可以使用VisualVM或其他工具来查看更多关于发生情况的信息。并且根据Oracle文档中的内容,初始堆大小为物理内存的1/64,最大堆大小为物理内存的1/4。

0
0 Comments

频繁进行垃圾回收的原因是应用程序使用了JVM分配的所有内存,从某个点开始,垃圾回收占用的时间过长,直到出现"GC Overhead Limit Exceeded"错误。解决方法是显式设置最大堆大小(使用"-Xmx 10g"命令),以确保充分利用所有可用内存。可以使用jconsole来可视化检查线程和堆的工作情况,也可以手动执行垃圾回收,但不建议在生产环境中手动执行垃圾回收。当设置了最大堆大小后,垃圾回收减少了,但EU/OU的值仍然是6g,不清楚为什么。但垃圾回收减少了,尽管服务器上没有运行其他进程。

0