/**
* @author lixiang
* @date 2023/5/4 20:53
*/
public class JVMTest {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(1000000);
}
}
(1)命令jps:全称 java process Status Tool
, Java版的ps命令,查看java进程及其相关的信息的pid则可以用这个命令,和linux的ps类似
jps [options] [hostid]
- -l:显示进程id,显示主类全名或这jar路径
- -q : 显示进程id
- -m : 显示进程id, 显示JVM启动时传递给main()的参数
- -v : 显示进程id,显示JVM启动时显示指定的JVM参数
- hostid : 主机或其他服务器ip
- jps -l 输出jar包路径,类的全名
![在这里插入图片描述](https://img-blog.csdnimg.cn/2505ee707d25440a91e16ee6aa862131.jpeg#pic_center)
- jps -v 输出JVM参数
![在这里插入图片描述](https://img-blog.csdnimg.cn/342f469332fd486595347194f61af9bb.jpeg#pic_center)
(2)命令jinfo:全称 Configuration Info for Java ,可以用来查看jvm参数和动态修改部分jvm参数的命令
jinfo [options] <pid>
- no options :输出所有的系统属性和参数
- -flag <具体参数> pid: 查看具体参数的值
- -flag [+|-] : 打开或关闭参数
- -flag = 设置参数值
- -flags 打印所有参数
- -sysprops 打印系统配置
- jinfo -flags pid 查看曾经赋过值的参数值
![在这里插入图片描述](https://img-blog.csdnimg.cn/a4828fb19d0c43e2b043301e3950cb69.jpeg#pic_center)
- jinfo -flag <具体参数> pid 查看具体参数的值
![在这里插入图片描述](https://img-blog.csdnimg.cn/f4477536abb342d1b6fb49880e3d2605.jpeg#pic_center)
- jinfo 动态进行参数修改
- 查看哪些可以动态修改参数 `java -XX:+PrintFlagsFinal -version | grep manageable`
![在这里插入图片描述](https://img-blog.csdnimg.cn/028e9207aec84b72af045759c3110f6c.jpeg#pic_center)
- 修改方式
- 布尔类型: jinfo -flag +-参数 pid
- 非布尔类型: jinfo -flag 参数名=参数值 pid
- `jinfo -flag +HeapDumpAfterFullGC 11190`
![在这里插入图片描述](https://img-blog.csdnimg.cn/84c5906da35d470cbef782930cd0dc2c.jpeg#pic_center)
(1)命令jstat:Java Virtual Machine statistics monitoring tool, 对Java应用程序的资源进行实时监控,包括堆和垃圾回收状况的监控
jstat [-option] [vmid] [间隔时间/毫秒] [查询次数]
- vmid:Virtual Machine ID( 进程的 pid)
- interval:执行每次的间隔时间,单位为毫秒
- count:用于指定输出多少次记录,缺省则会一直打印
- -class 查看类加载情况的统计
- -compiler 查看HotSpot中即时编译器编译情况的统计
- -gc 查看JVM中堆的垃圾收集情况的统计
- -gccapacity 查看新生代、老生代及持久代的存储容量情况
- -gcmetacapacity 显示metaspace的大小
- -gcnew 查看新生代垃圾收集的情况
- -gcnewcapacity 用于查看新生代存储容量的情况
- -gcold 查看老生代及持久代垃圾收集的情况
- -gcoldcapacity 用于查看老生代的容量
- -gcutil 显示垃圾收集信息
- -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次仅当前正在发生的垃圾收集的原因
- -printcompilation 输出JIT编译的方法信息
- jstat -class pid 查看类加载情况的统计
* Loaded:加载类的数量
* Bytes:加载类的size,单位为Byte
* Unloaded:卸载类的数目
* Bytes:卸载类的size,单位为Byte
* Time:加载与卸载类花费的时间
![在这里插入图片描述](https://img-blog.csdnimg.cn/355ac5a951a64c819ce8b897dacbfda8.jpeg#pic_center)
- jstat -gc pid 查看JVM中堆的垃圾收集情况的统计,输出实际的值
- S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
- S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
- S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
- S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
- EC:年轻代中Eden(伊甸园)的容量 (字节)
- EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
- OC:Old代的容量 (字节)
- OU:Old代目前已使用空间 (字节)
- MC:metaspace(元空间)的容量 (字节)
- MU:metaspace(元空间)目前已使用空间 (字节)
- CCSC:当前压缩类空间的容量 (字节)
- CCSU:当前压缩类空间目前已使用空间 (字节)
- YGC:从应用程序启动到采样时年轻代中gc次数
- YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
- FGC:从应用程序启动到采样时Full GC 的次数
- FGCT:从应用程序启动到采样时Full GC 所用时间(s)
- GCT:从应用程序启动到采样时垃圾回收消耗总时(s)
![在这里插入图片描述](https://img-blog.csdnimg.cn/72b4c53bbfde45e698913fab560cb546.jpeg#pic_center)
- jstat -gcutil pid 时间间隔 打印次数 显示垃圾收集信息,和-gc类似,不过是百分比展示, 每隔2000毫秒打印一次,打印3次
* S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
* S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
* E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
* O 老年代已使用的占当前容量百分比
* M 元数据区已使用的占当前容量百分比
* CCS 压缩使用百分比
* YGC 年轻代垃圾回收次数
* YGCT 年轻代垃圾回收消耗时间
* FGC Full GC垃圾回收次数
* FGCT Full GC垃圾回收消耗时间
* CGC: 并发GC次数
* CGCT: 并发GC总耗时
* GCT 垃圾回收消耗总时间
![在这里插入图片描述](https://img-blog.csdnimg.cn/663098cbd5b04ae1b779fbefafd7cddb.jpeg#pic_center)
- jstat -gccause pid 显示垃圾回收的相关信息,最后一次或当前正在发生的垃圾回收的诱因
![在这里插入图片描述](https://img-blog.csdnimg.cn/d6915ed6018e40e2a357d8d56caf58b9.jpeg#pic_center)
- LGCC:最后一次GC原因,常见是 `Allocation Failure` 申请内存失败
- GCC:当前GC原因(No GC 为当前没有执行GC)
(1)命令 jstack:Java堆栈跟踪工具, 可以打印出Java应用程序中所有线程的堆栈信息,包括线程状态、调用栈信息、锁信息等
jstack [ options ] pid
* -l 打印关于锁的附加信息,如持有锁的线程、等待锁的线程等
* jstack -l pid 查看线程堆栈信息
* 开头是线程名称,即`main` 线程,后面的为线程信息,线程状态如下
- NEW
- RUNNABLE
- BLOCKED#进入synchronized之前
- WAITING#已经进入synchronized,调用了wait()
- TIMED_WAITING#已经进去synchronized,调用了sleep()
- TERMINATED#线程结束
* `#1` 表示当前线程ID,从 `main`线程开始,`JVM` 根据线程创建的顺序为线程编号
* `prio` 是`priority`优先级的缩写,代表当前线程的优先级,范围为[1-10]默认为 5,数值越低越优先获取到计算资源
* `cpu=60.91ms` 表示进程在CPU上的运行时间为60.91毫秒
- 指的是进程实际占用CPU的时间,
* `elapsed=13.05s` 表示进程已经运行13.05秒
- 进程从开始运行到当前时刻所经过的时间,包括进程等待时间和实际运行时间
* `os_prio`为线程对应系统的优先级
* `tid` 表示Java内的线程ID,同样在Thread类中(可以不管)
* `nid`
- 本地线程编号`NativeID`的缩写, 表示操作系统级别的线程ID,
- 对应JVM 虚拟机中线程映射在操作系统中的线程编号,是十六进制
![在这里插入图片描述](https://img-blog.csdnimg.cn/6cc3a97a9bff4566a52e31c02fb26270.jpeg#pic_center)
(2)案例分析
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CpuTest {
private static ExecutorService executorService = Executors.newFixedThreadPool(5);
public static void main(String[] args) {
Task task1 = new Task();
Task task2 = new Task();
executorService.execute(task1);
executorService.execute(task2);
}
public static Object lock = new Object();
static class Task implements Runnable{
@Override
public void run() {
synchronized (lock){
long sum = 0L;
while (true){
sum += 1;
}
}
}
}
}
printf "%x\n" 线程id
jstack -l [PID] >/tmp/log.txt
(1)命令jmap:Memory Map for Java , 用于生成Java堆转储快照(heap dump),分析Java应用程序的内存使用情况
jmap [option] pid
jmap -heap 进程id
查看堆信息, 这个命令会让JVM 是暂停服务的,所以对线上的运行会产生影响,不推荐该方式jhsdb jmap --pid 进程id --heap
[mac@localhost lixiang ~]# jhsdb jmap --pid 3110235 --heap
Attaching to process ID 3110235, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.8+10-LTS
using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40 #最小堆空闲比例。
MaxHeapFreeRatio = 70 #最大堆空闲比例。
MaxHeapSize = 1979711488 (1888.0MB) #最大堆大小。
NewSize = 1363144 (1.2999954223632812MB) #新生代大小。
MaxNewSize = 1186988032 (1132.0MB) #最大新生代大小。
OldSize = 5452592 (5.1999969482421875MB) #老年代大小。
NewRatio = 2 #新生代和老年代的比例。
SurvivorRatio = 8 #新生代中eden区和survivor区的比例。
MetaspaceSize = 21807104 (20.796875MB) #元空间大小。
CompressedClassSpaceSize = 1073741824 (1024.0MB) #压缩类空间大小。
MaxMetaspaceSize = 17592186044415 MB #最大元空间大小。
G1HeapRegionSize = 1048576 (1.0MB) //G1垃圾收集器每个Region大小
Heap Usage:
G1 Heap:
regions = 1888 #堆中区域数量
capacity = 1979711488 (1888.0MB) #堆的总容量
used = 12332544 (11.76123046875MB) #堆已使用的容量
free = 1967378944 (1876.23876953125MB) #堆未使用的容量
0.6229465290651484% used #堆的使用率。
G1 Young Generation: #G1垃圾收集器中的年轻代。
Eden Space: #年轻代中的Eden区域。
regions = 8
capacity = 75497472 (72.0MB)
used = 8388608 (8.0MB)
free = 67108864 (64.0MB)
11.11111111111111% used
Survivor Space: #年轻代中的survivor区域
regions = 2
capacity = 2097152 (2.0MB)
used = 2097152 (2.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation: #G1垃圾收集器中的老年代。
regions = 2
capacity = 46137344 (44.0MB)
used = 1846784 (1.76123046875MB)
free = 44290560 (42.23876953125MB)
4.002796519886363% used #老年代的使用率。
jconsole
启动即可,选择自己的类进程原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。