*/
public class DEMO01 {
public static void main(String[] args) throws IOException {
System.out.println(“jps”);
//阻塞
System.in.read();
}
}
复制代码
jstat:虚拟机信息监控工具
jstat:Linux环境上,运行期定位JVM性能问题的首选工具,常用来查看内存变化趋势,GC情况、类加载情况等
使用格式 : jstat [option vmid [interval [s|ms] [count]] ]
-
option 代表我们所要查询的虚拟机细信息。主要包括:类装载,垃圾回收,运行期编译情况
-
vmid 若是运行在本地的虚拟机进程那就是程序运行的pid,若是远程虚拟机,格式应该是 [protocol:][//]lvmid[@hostname[:port]/servername]
-
interval 查询间隔
-
count 查询次数
忽略interval和count参数,那么命令只会执行一次 比如 jstat -gc 2101 500 5 表示每500ms查询一次2101进程的垃圾回收情况,一共执行5次
示例一:
public class DEMO02 {
public static void main(String[] args) throws IOException {
System.out.println(“jstat”);
System.in.read();
}
}
复制代码
S0C,S1C是指Survivor0区1区的容量;S0U,S1U是指这两幸存区的使用量;C代表Capacity,U代表Used,上面反应的是各个区的初始容量以及使用情况,GC的次数和时间。
示例二:
import java.io.IOException;
public class DEMO03 {
//启动参数设置:-Xms20M -Xmx20M -Xmn10M -xx:+UseserialGC -XX: +PrintGcDetails -verbose:gc
public static void main(String[] args) throws IOException {
final int _1MB = 1024 * 1024;
byte[] b1 = new byte[_1MB];
System.out.println(“1…”);
System.in.read();
byte[] b2 = new byte[2*_1MB];
System.out.println(“2…”);
System.in.read();
byte[] b3 = new byte[2*_1MB];
System.out.println(“3…”);
System.in.read();
}
}
复制代码
指定DEMO03运行时JVM参数,设置堆区为20M,新生代10M,使用Serial垃圾收集器
可以看到在三次打印中,Eden区发生的变化,发生了一次YoungGC,GC时间是0.015S
jstack:查看Java线程堆栈信息
使用格式: jstack [option] vmid
示例一:一段死循环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【需要在后台运行很长时间才会有反应…】
定位到问题线程:定位到具体的问题线程 ps -mp pid -o THREAD,tid,time 如图所示在java进程中2819的线程最耗资源
查看问题线程的堆栈信息:先将线程id转换为16进制(英文小写格式) printf “%x\n” 问题线程的id转为16进制英文小写
在使用jstack查看线程的堆栈信息 jstack pid |grep tid -A60
由此便可以查看到是demo.java中的第六行出了问题【此处只是小demo去模拟程序死循环,CPU线上预警出现的可能性很多,常见的还有内存泄露、死锁、频繁GC…需要结合linux命令和java命令和实际情况进行逐步排查】
jinfo:查看/设置虚拟机的参数
jinfo可以查看JVM的参数,并允许在程序运行期间修改JVM的参数,这样JVM就不用重启了。
使用格式: jinfo [option] pid ,可以通过-flag[+|-] name 添加和删除一些参数,或者-flag name =value修改一些参数,但是很多参数是不允许修改的
public class DEMO04 {
public static void main(String[] args) throws IOException {
System.out.println(“jinfo”);
System.in.read();
}
}
复制代码
jmap:生成dump文件
jmap用于生成一份堆存储快照(dump),把Java堆区的使用情况快照一份导出来供我们排查问题。
使用格式 : jmap [option] vmid
示例:
public class DEMO05 {
public static void main(String[] args) throws IOException {
System.out.println(“jmap”);
System.in.read();
}
}
复制代码
显示堆区的详细信息 jmap -heap pid
生成堆快照存储文件,format=b生成的是二进制文件, jmap -dump:live,format=b,file=D:\jmap.bin pid
jhat:虚拟机存储快照分析工具
使用jmap将堆区的快照文件导出后,可以使用jhat进行分析,不过jhat现在使用较少。
使用格式: jhat [-stack ] [-refs ] [-port ] [-baseline ] [-debug ] [-version] [-h|-help]
示例:
可视化工具
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客户端
JConsole客户端包括概览、内存、线程、类、VM概要、MBean这大块。
概览:主要运行数据的概览,包括堆内存,线程,类,CPU使用情况四项信息的变化趋势图
内存:JDK为1.8,使用的垃圾收集器为ParallerScavenge+Parallel Old,可以监视堆内存以及其中各个区域(Eden区,Survivor区,老年代)的变化趋势,还可以监视非堆(元空间)的内存变化趋势,相当于命令行中的jstat
线程:可以查看当前程序有哪些线程在运行,单机可以查看线程的堆栈信息,相当于命令行工具的jstack,其左下角还有检测死锁的按钮。
类:如图所示,显示了系统以及装载的类数量。在详细信息栏中,还显示了已卸载的类数量。
类:如图所示,显示了系统以及装载的类数量。在详细信息栏中,还显示了已卸载的类数量。
示例二: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();
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-7bhfgtxo-1714858516401)]
[外链图片转存中…(img-4Qr6XS4F-1714858516401)]
[外链图片转存中…(img-dOLDpWsB-1714858516401)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!