擴展內(nèi)容
查看線程
windows
- tasklist 、tasklist | findstr java (管道運算符)
- taskkill 、taskkill /F /PID XXX(/F 強制殺死 )
Linux
- ps -fe 查看所有進程
- ps -fT -p <PID> 查看某個進程(PID)的所有線程
- kill 殺死進程
- top 按大寫 H 切換是否顯示線程
- top -H -p <PID> 查看某個進程的所有線程
Java
- jps 命令查看所有 Java 進程
- jstack <PID> 查看某個進程的所有線程狀態(tài)
- jconsole 來查看某個Java 進程中線程的運行情況(圖形界面)
jconsole 遠程監(jiān)控配置
- 需要以如下方式運行你的 java 類
java -Djava.rmi.server.hostname=IP
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=PORT
-Dcom.sun.management.jmxremote.ssl=true/false(是否啟用安全鏈接)
-Dcom.sun.management.jmsremote.authenticate=true/false(是否認證) JAVA類
- 修改 /etc/hosts 文件 將 127.0.0.1 映射到主機名
如果需要認證訪問,還需要做如下步驟
- 復制 jmxremote.password 文件
- 修改 jmxremote.password he jmxremote.access 文件的權(quán)限為 600 即文件所有者可讀寫
- 連接時填入 controlRole(用戶名),R&D(密碼)
線程運行原理
棧與棧幀
Java Virtual Machine Stacks(Java 虛擬機棧)
JVM 由堆、棧、方法區(qū)組成,其中,棧就是給線程使用的,每個線程啟動后,虛擬機就會給其分配一塊棧內(nèi)存。
- 每個棧由多個棧幀(Frame)組成,對應著每次方法調(diào)用時所占用的內(nèi)存
-
每個線程只能有一個活動棧幀,對應著當前正在執(zhí)行的那個方法
image.png
image.png
image.png
線程上下文切換(Thread Context Switch)
因為以下原因?qū)е?CPU 不再執(zhí)行當前線程,轉(zhuǎn)而執(zhí)行另一個線程的代碼
- 線程的 CPU 時間片用完
- 垃圾回收(垃圾回收線程執(zhí)行時,會暫停其他的工作線程)
- 有更高優(yōu)先級的線程需要運行(前三種都是被動的)
- 線程自己調(diào)用了sleep、yield、wait、join、park、synchronized、lock 等方法
當 Context Switch 發(fā)生時,需要有操作系統(tǒng)保存當前線程的狀態(tài),并恢復另一個線程的狀態(tài),Java 中對應的概念就是程序計數(shù)器(Program Counter Register),他的作用是記住下一條 JVM 指令的執(zhí)行地址,是線程私有的
- 狀態(tài)包括程序計數(shù)器、虛擬機棧中每個棧幀的信息,如局部變量、操作數(shù)棧、返回地址等
-
Context Switch頻繁發(fā)生會影響性能
image.png



