歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 工具(jmap,jstack)在Linux上的源碼分析(四)safe point

Java 工具(jmap,jstack)在Linux上的源碼分析(四)safe point

日期:2017/3/1 10:40:24   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved