关于并行GC触发OutOfMemoryError时“总时间”含义的技术问询
并行垃圾收集器中“总时间”的具体定义
针对你提到的并行GC抛出OutOfMemoryError的触发条件,这里的总时间其实很好理解:它指的是从你的Java应用启动开始,到触发这个错误前的全部运行时长——这个时长包含了两部分:应用业务代码的执行时间,加上所有垃圾回收过程消耗的时间总和。
咱们再结合文档里的规则拆解下:
如果垃圾回收(GC)占用时间过长,并行收集器会抛出OutOfMemoryError:若超过98%的总时间用于垃圾回收,且回收的堆内存不足2%,则抛出OutOfMemoryError。
并行收集器会在运行过程中持续统计两个核心指标:
- 所有GC阶段累计消耗的时间,占应用总运行时间的比例
- 每次GC完成后,实际释放的堆内存占当前堆总容量的比例
当这两个条件同时触发时,收集器会判定:当前应用已经陷入了“无效GC循环”——几乎所有时间都花在回收内存上,但每次只能回收极少量空间,说明堆内存已经严重不足,继续GC也没法给业务代码腾出可用空间,反而会浪费CPU资源,所以直接抛出OutOfMemoryError来终止程序,避免无意义的资源消耗。
举个直观的例子:假设你的应用启动后总共跑了100秒,其中99秒都在执行GC操作,而且每次GC只能回收不到当前堆2%的内存,这时候就会触发这个错误。
内容的提问来源于stack exchange,提问作者njk2015
相关产品推荐
相关产品推荐

