观察多个线程同时运行 + 原理之线程运行和一些常见方法
主要是理解
交替执行
谁先谁后,不由我们控制
查看进程线程的方法
windows
任务管理器可以查看进程和线程数,也可以用来杀死进程
tasklist
查看进程
taskkill
杀死进程
linux
ps - fe 查看所有进程
ps - fT - p <PID> 查看某个进程( PID )的所有线程 kill 杀死进程
top 按大写 H 切换是否显示线程
top - H - p <PID> 查看某个进程(PID )的所有线程+
Java
jps 命令查看所有 Java 进程
jstack <PID> 查看某个 Java 进程( PID )的所有线程状态
jconsole 来查看某个 Java 进程中线程的运行情况(图形界面)
jconsole 远程监控配置
需要以如下方式运行你的 java 类
修改 /etc/hosts 文件将 127.0.0.1 映射至主机名
如果要认证访问,还需要做如下步骤
复制 jmxremote.password 文件
修改 jmxremote.password 和 jmxremote.access 文件的权限为 600 即文件所有者可读写
连接时填入 controlRole (用户名), R&D (密码)
* 原理之线程运行
栈与栈帧
Java Virtual Machine Stacks ( Java 虚拟机栈)
我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟 机就会为其分配一块栈内存。
每个栈由多个栈帧(Frame )组成,对应着每次方法调用时所占用的内存
每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
线程上下文切换( Thread Context Switch )
因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码
线程的 cpu 时间片用完
垃圾回收
有更高优先级的线程需要运行
线程自己调用了 sleep 、 yield 、 wait 、 join 、 park 、 synchronized 、 lock 等方法
当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态, Java 中对应的概念 就是程序计数器(Program Counter Register ),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的
状态包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等
Context Switch 频繁发生会影响性能
常见方法