Java GC安全点

时间:2013-10-05 18:39:40

标签: java garbage-collection

当垃圾收集器在清理未引用的对象之前冻结应用程序线程时,所有线程都必须位于" safepoint"在执行中。我发现了大量描述安全点概念的文章,但很少有例子。安全点将放置在典型的Java方法中,为什么?更重要的是,安全点何处才能发生?

2 个答案:

答案 0 :(得分:14)

safepoint的确切定义和实现从一个VM实现更改为另一个VM实现,但考虑到Hotspot VM,您可以在Safepoints in HotSpot JVM中找到一个很好的定义。

HotSpot glossary说:

  

程序执行期间的所有GC根已知且所有堆对象内容一致的点。从全局的角度来看,所有线程必须在GC运行之前在安全点阻塞。

通常,安全点是通过JVM将安全点检查注入方法来实现的,大多数调用站点都有资格作为安全点 - 当到达安全点检查时,线程将检查是否需要安全点(例如,已安排FullGC),如果是,然后线程阻塞。当VM中的所有线程阻塞时,您已到达安全点,VM中的所有对象都可以完全访问。然后,执行请求安全点的VM操作(例如,FullGC),之后恢复线程。

检查需要安全点的VM操作列表:Safety First: Safepoints

您可以使用-XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1来研究Hotspot中的安全点行为。

答案 1 :(得分:8)

不幸的是,这是一个很难定义的领域。 JVM在决定时会放置安全点,但是没有规定什么时候。下一个Java的一个版本/更新可能不同。在某些情况下,例如Unsafe.copyMemory()没有安全点,但您无法确定将放置安全点的位置。