JAVA应用的性能做监控和调优(1)

本章内容 : https://coding.imooc.com/class/chapter/241.html#Anchor
这是我的课程笔记
JVM的参数类型
运行时JVM参数查看
jstat查看虚拟机统计信息
jmap+MAT内存溢出
jstack死循环和死锁

JVM参数类型:
标准参数:
-help
-server -client
-version -showversion
-cp -classpath

X参数 非标准化参数,在不同的JVM版本中可能有所不同:
-Xint:解释执行
-Xcomp:第一次使用就编译成本地代码
-mixed:混合模式 JVM自己决定是否编译程本地代码
在这里插入图片描述
JVM默认方式

XX参数 非标转化参数
相对不稳定
主要用于JVM调优和Debug
XX参数分类
Boolean类型
格式:-XX:[±]表示启用或者禁用name属性
例如: -XX:+UseConcMarkSweepGC //启用CMS垃圾处理器
-XX:+UseG1GC //G1垃圾处理器
非Boolean类型
格式 -XX:=表示name属性的值时value
例如 -XX:MaxGCPauseMillis=500 //GC的最大停留时间是500
-XX:gctimeRatio=19

-Xms -Xm 最大内存和最小内存
是X参数 而不是XX参数
-Xms等价于 -XX:InitialHeapSize //初始化堆的大小
-Xmx等价于 -XX:MaxHeapSize //最大堆的大小

查看JVM运行时参数
-XX:+PrintFagsInitial //查看一些初始值
-XX:+PrintFagsFinal //查看最终值 =表示默认值 :=表示被(用户或者JVM)修改后的值
-XX:+UnlockExPerimentTalVMOptions //解锁实验参数
-XX:+UnlockDiagnosticVMOptions //解锁诊断参数
–xx:+PrintCommandLineFlags //打印命令行参数

jsp查看java进程
只有安装了JVM启动时候才能用,在windos中如果没有运行的java程序 jps没反应
JVM相关指令 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html

jinfo
查看正在运行的JVM参数值使用

jinfo -flag MaxHeapSize 进程id //查看正在运行的tomcat的最大内存
在这里插入图片描述
jinfo -flags 进程id
查看已经赋过值的参数
在这里插入图片描述
jinfo举例
查看最大内存
jinfo -flag MaxHeapSize 11868
查看垃圾回收器
在这里插入图片描述
jatat
查看JVM统计信息 例如
类加载
垃圾收集 (重点)
JIT编译
命令格式
在这里插入图片描述
-class //查看类加载信息
-compiler //查看编译信息
-gc // 查看垃圾回收器
-printcompilation // 显示Java HotSpot VM编译方法统计信息
详细 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

类加载
jstat -class 11868 1000 10 //11868 pid 1000 每隔1000ms 10 次数
在这里插入图片描述

在这里插入图片描述
垃圾收集
-gc -gcutil -gccause -gcnew -gcold
在这里插入图片描述
在这里插入图片描述
JVM内存模型 参考 https://zhuanlan.zhihu.com/p/55274818
在这里插入图片描述
其中唯一不会溢出的就是 程序计数器

各部分的作用
程序计数器(线程私有)
每个线程执行字节码的行号指示器(字节码文件中方法的code属性表中的指令),字节码解释器通过改变自己计数器的值来选取下一条需要执行的字节码指令。每个线程都有独立的程序计数器。
本地方法栈
和虚拟机栈作用类似,本地方法栈是执行native方法。
(线程私有)
栈用于存放对象的引用,和基本数据类型的 而不储存对象, 在方法中new出来的对象,对象引用在栈中,对象实例在堆中
栈内存的更新速度很快,因为局部变量的生命周期都很短。

(线程共享)
此区域是jvm中最为复杂也是最大的一块的区域,首先堆分为老年代和新生代,新生代又分为Eden区和两个survivor区。每块细分的区域涉及到GC相关内容.
堆主要存放Java在运行过程中new出来的对象,凡是通过new生成的对象都存放在堆中,对于堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理。

方法区(元数据区)(线程共享)
虚拟机加载字节码阶段,字节码中的类信息,常量,静态变量,即使编译器编译后的代码等数据存放在方法区(结合第一篇理解,就是把字节码文件的所有内容全部加载到方法区)。

jmap+MAT 内存溢

手动内存溢出
设置内存大小
在这里插入图片描述
启动程序+现象(堆内存溢出) 堆中存放的时new出来的对象 不停的new 想办法让gc不去释放,就可以了 最终都会爆出 OutOfMemoryError 这样的错误.
在这里插入图片描述
非堆溢出
非堆主要是指方法区或元数据区 JDK8之后不再有方法区
方法区包含所有的class和static变量
设置内存大小
-XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
在这里插入图片描述
导出内存映像文件
内存溢出自动导出
-XX :+HeapDumpOnOutOfMemoryError //发生内存溢出时 导出内存映像
-XX:HeapDumpPath=./ //导出位置 (这样写时当前路径)
在这里插入图片描述
在这里插入图片描述

使用jmap命令手动导出
jmap详细说明文档: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html
在这里插入图片描述
jmap -heap 15816 打印各个区块占用多少内存
在这里插入图片描述
使用MAT分析内存溢出
IDEA版本插件: https://www.ej-technologies.com/download/jprofiler/files
Eclipse版本插件 : https://www.eclipse.org/mat/downloads.php
我目前使用的时IDEA 参考 https://blog.csdn.net/qq_19674905/article/details/80824858
Eclipse参考: https://blog.csdn.net/caihaijiang/article/details/7745251

jstack —死循环和死锁
当CUP飙高时,估计就是陷入死循环
jstack命令格式
jstack 19024 >log.txt // 19024 pid >log.txt 重定向到log.txt
在这里插入图片描述
在这里插入图片描述
“http-nio-8080-Acceptor-0” 线程名称
daemon 说明是个守护线程
prio=5 线程优先级
nid=0x210c //线程编号 这个时16进制的
java.lang.Thread.State: WAITING (parking) //线程状态 这里最重要
线程状态分为 ; https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr034.html
NEW 该线程尚未启动
RUNNABLE 线程正在JVM中执行。
BLOCKED 线程被阻塞等待监视器锁定
WAITING 线程无限期地等待另一个线程执行特定操作。
TIMED_WAITING 线程正在等待另一个线程执行最多指定等待时间的操作。
TERMIMNATED 线程已经退出。

查看cpu飙高方式
1\查看占用cpu最高的进程
2\查看其中进程中运行的线程
3\找到线程占用cpu最高的线程找到其线程编号(线程编号时10进制需转为16进制)
4\使用jstack 导出线程相关信息
5\查找3中找到16进制线程号,可以看看这个线程在干什么.

死锁问题也是用类似的方法定位的 主要是找到进程id和线程id然后定位到这里看看他们在干什么
参考: https://blog.csdn.net/learner198461/article/details/79429724

基于jvisualvm的可视化监控
内容:
监控本地tomcat
监控远程tomcat
监控普通java进程
jvisualvm的路径在你本机JDK安装路径中bin文件夹中 jvisualvm.exe
直接双击打卡即可 自动监控所有运行的java程序
在这里插入图片描述
这里相当于
在这里插入图片描述
类似MAT中 -XX :+HeapDumpOnOutOfMemoryError //发生内存溢出时 导出内存映像
-XX:HeapDumpPath=./ //导出位置 (这样写时当前路径)

这里可以找出程序慢的原因
在这里插入图片描述
安装GC和Trace
GC可以很直观的看到内存分区情况
在这里插入图片描述
在这选择安装就可以了 (安装之后Trace选择指定项目右键可以找到)

在这里插入图片描述
监控远程Tomcat
在这里插入图片描述
修改Tomcat的Catalina.sh文件 重要的是端口和IP地址 此文件在tomcat中bin目录下
在这里插入图片描述
这些东西添加完之后,重启tomcat,右键选择 添加jstatd连接

下一章讲btrace

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值