JDK命令行工具与可视化工具,java异步编程实战

指定DEMO03运行时JVM参数,设置堆区为20M,新生代10M,使用Serial垃圾收集器

image

image

可以看到在三次打印中,Eden区发生的变化,发生了一次YoungGC,GC时间是0.015S

image

jstack:查看Java线程堆栈信息

使用格式: jstack [option] vmid

image

示例一:一段死循环ava程序,模拟linux环境下疯狂占用cpu资源

improt java.util.Random;

public class demo {

public static void main(String[] args) {

while(true){

System.out.println(new Random().nextInt(77778888));

}

}

}

复制代码

查看系统状况:用top命令去查各个进程CPU、内存的资源消耗情况,找出最耗资源的进程pid,如图所示,最耗资源的是java进程,pid是2818【需要在后台运行很长时间才会有反应…】

image

定位到问题线程:定位到具体的问题线程 ps -mp pid -o THREAD,tid,time 如图所示在java进程中2819的线程最耗资源

image

查看问题线程的堆栈信息:先将线程id转换为16进制(英文小写格式) printf “%x\n” 问题线程的id转为16进制英文小写

image

在使用jstack查看线程的堆栈信息 jstack pid |grep tid -A60

image

由此便可以查看到是demo.java中的第六行出了问题【此处只是小demo去模拟程序死循环,CPU线上预警出现的可能性很多,常见的还有内存泄露、死锁、频繁GC…需要结合linux命令和java命令和实际情况进行逐步排查】

jinfo:查看/设置虚拟机的参数

jinfo可以查看JVM的参数,并允许在程序运行期间修改JVM的参数,这样JVM就不用重启了。

使用格式: jinfo [option] pid ,可以通过-flag[+|-] name 添加和删除一些参数,或者-flag name =value修改一些参数,但是很多参数是不允许修改的

image

public class DEMO04 {

public static void main(String[] args) throws IOException {

System.out.println(“jinfo”);

System.in.read();

}

}

复制代码

image

image

jmap:生成dump文件

jmap用于生成一份堆存储快照(dump),把Java堆区的使用情况快照一份导出来供我们排查问题。

使用格式 : jmap [option] vmid

image

示例:

public class DEMO05 {

public static void main(String[] args) throws IOException {

System.out.println(“jmap”);

System.in.read();

}

}

复制代码

显示堆区的详细信息 jmap -heap pid

image

生成堆快照存储文件,format=b生成的是二进制文件, jmap -dump:live,format=b,file=D:\jmap.bin pid

image

jhat:虚拟机存储快照分析工具

使用jmap将堆区的快照文件导出后,可以使用jhat进行分析,不过jhat现在使用较少。

使用格式: jhat [-stack ] [-refs ] [-port ] [-baseline ] [-debug ] [-version] [-h|-help]

image

示例:

image

image

可视化工具

jconcle

作用:查看Java应用程序运行时情况,监视垃圾收集器的内存变化趋势,以及监视程序内的线程。

示例一:JConsole演示内存变化

public class DEMO07 {

public static void main(String[] args) throws IOException, InterruptedException {

Thread.sleep(5000);

System.out.println(“start…”);

test();

System.in.read();

}

public static void test() throws InterruptedException {

final int _128K = 128 * 1024;

List<byte[]> list = new ArrayList<>();

for (int i = 0; i < 10000; i++) {

//耗时操作,令监视器的曲线变化更加明显

Thread.sleep(100);

list.add(new byte[_128K]);

}

}

}

复制代码

在控制台输入jconsole即可启动JConsole客户端

image

JConsole客户端包括概览、内存、线程、类、VM概要、MBean这大块。

概览:主要运行数据的概览,包括堆内存,线程,类,CPU使用情况四项信息的变化趋势图

image

内存:JDK为1.8,使用的垃圾收集器为ParallerScavenge+Parallel Old,可以监视堆内存以及其中各个区域(Eden区,Survivor区,老年代)的变化趋势,还可以监视非堆(元空间)的内存变化趋势,相当于命令行中的jstat

image

线程:可以查看当前程序有哪些线程在运行,单机可以查看线程的堆栈信息,相当于命令行工具的jstack,其左下角还有检测死锁的按钮。

image

类:如图所示,显示了系统以及装载的类数量。在详细信息栏中,还显示了已卸载的类数量。

image

类:如图所示,显示了系统以及装载的类数量。在详细信息栏中,还显示了已卸载的类数量。

image

示例二:JConcle示例死循环、阻塞等待、死锁现象

import java.io.IOException;

import java.util.concurrent.TimeUnit;

public class DEMO08 {

public static void main(String[] args) throws IOException {

System.in.read();

System.out.println(“开启死循环线程”);

whileTureThread();

System.in.read();

System.out.println(“开启等待线程”);

waitThread();

System.in.read();

System.out.println(“开启死锁线程”);

deadLock();

}

/**

  • 死循环线程

*/

private static void whileTureThread() {

new Thread(() -> {

while (true) {

}

}, “whileTrueThread”).start();

}

/**

  • 等待线程

*/

private static void waitThread() {

new Thread(() -> {

synchronized (DEMO08.class) {

try {

DEMO08.class.wait();

} catch (InterruptedException e) {

e.printStackTrace(

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

);

}

}

},“waitThread”).start();

}

/**

  • 模拟死锁现象

*/

private static void deadLock() {

String A = “A”;

String B = “B”;

new Thread(() -> {

synchronized (A) {

try {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值