safe point 顧明思意,就是安全點,當需要jvm做一些操作的時候,需要把當前正在運行的線程進入一個安全點的狀態(也可以說停止狀態),這樣才能做一些安全的操作,比如線程的dump,堆棧的信息。
在jvm裡面通常vm_thread(我們一直在談論的做一些屬於vm 份內事情的線程) 和cms_thread(內存回收的線程)做的操作,是需要將其他的線程通過調用SafepointSynchronize::begin 和 SafepointSynchronize:end來實現讓其他的線程進入或者退出safe point 的狀態。
相關鏈接:
http://www.linuxidc.com/Linux/2012-01/51215.htm
http://www.linuxidc.com/Linux/2012-01/51213.htm
http://www.linuxidc.com/Linux/2012-01/51216.htm
通常safepoint 的有三種狀態
_not_synchronized 說明沒有任何打斷現在所有線程運行的操作,也就是vm thread, cms thread 沒有接到操作的指令 _synchronizing vm thread,cms thread 接到操作指令,正在等待所有線程進入safe point _synchronized 所有線程進入safe point, vm thread, cms thread 可以開始指令操作
通常在java 進程中的Java 的線程有幾個不同的狀態,如何讓這些線程進入safepoint 的狀態中,jvm是采用不同的方式
a. 正在解釋執行
由於java是解釋性語言,而線程在解釋java 字節碼的時候,需要dispatch table,記錄方法地址進行跳轉的,那麼這樣讓線程進入停止狀態就比較容易了,只要替換掉dispatch table 就可以了,讓線程知道當前進入softpoint 狀態。
java裡會設置3個DispatchTable, _active_table, _normal_table, _safept_table
_active_table 正在解釋運行的線程使用的dispatch table
_normal_table 就是正常運行的初始化的dispatch table
_safept_table safe point需要的dispatch table