扩展内容
查看线程
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> 查看某个进程的所有线程状态
- jconsole 来查看某个Java 进程中线程的运行情况(图形界面)
jconsole 远程监控配置
- 需要以如下方式运行你的 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 文件的权限为 600 即文件所有者可读写
- 连接时填入 controlRole(用户名),R&D(密码)
线程运行原理
栈与栈帧
Java Virtual Machine Stacks(Java 虚拟机栈)
JVM 由堆、栈、方法区组成,其中,栈就是给线程使用的,每个线程启动后,虚拟机就会给其分配一块栈内存。
- 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
-
每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
image.png
image.png
image.png
线程上下文切换(Thread Context Switch)
因为以下原因导致 CPU 不再执行当前线程,转而执行另一个线程的代码
- 线程的 CPU 时间片用完
- 垃圾回收(垃圾回收线程执行时,会暂停其他的工作线程)
- 有更高优先级的线程需要运行(前三种都是被动的)
- 线程自己调用了sleep、yield、wait、join、park、synchronized、lock 等方法
当 Context Switch 发生时,需要有操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),他的作用是记住下一条 JVM 指令的执行地址,是线程私有的
- 状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等
-
Context Switch频繁发生会影响性能
image.png



