【发布时间】:2021-01-09 16:34:54
【问题描述】:
使用System.gc() 方法可以强制运行完整的GC。这是非常昂贵的。有没有只强制第一代GC的选项?我的应用程序目前正在 Java 11 上运行。我正在考虑类似 MemoryPoolMXBean 的东西。
背景:我想启动一个消耗大量内存的任务,如果可用内存低于所需内存,那么我想知道我是否可以毫无风险地启动它,或者我应该稍后尝试还是将缓存交换到磁盘。实际上,我想知道第一次 GC 后的空闲内存。我们的分析表明,这在大多数情况下就足够了 (>99%)。
【问题讨论】:
-
不,这是不可能的。此外,对
System.gc()的调用只是对 JVM 的建议,即应该执行 gc,尽管在实践中,我不知道有任何 JVM 没有在System.gc()call 上运行 gc。 -
@Erik 但这是一个触发的并发标记阶段,它可能会产生完全为零的实际垃圾回收。
-
@Eugene 我考虑过,但这种情况更像是一个愿望,而不是你可以依赖的东西,所以它似乎不值得一提。但是,我确实想知道所描述的用例。如果考虑到所述背景,gc 时间可能会成为问题,那么我们在这里谈论的堆有多大?
-
因为我们使用内存消耗操作,所以堆可能非常大。许多 GB。然后 GC 可能需要更多的时间。这也是检查频率的问题。
标签: java memory garbage-collection mxbean