java 生产环境下性能监控
文章目录
一、jvm 参数类型
1. 标准参数
- -help
- -server -client
- -version -showversion
- -cp -classpath
2. X 参数 非标准化参数
- -Xint : 解释执行
- -Xcomp: 第一次使用就编译成本地代码
- -Xmixed: 混合模式,jvm 自己决定是否编译成本地代码
3. XX 参数
- 非标准化参数
- 相对不稳定
- 主要用于JVM调优和DEBUG
4. XX参数分类
4.1 Boolean类型
格式:XX:[±]表示启用或者禁用name属性
比如:-XX:+UseConcMarkSweepGc
4.2 非Boolean类型
格式:XX:=表示name属性的值
比如:-XX:+UseGCPauseMillis=500 – 停顿时间
5. -Xmx -Xms
-Xmx 等价于 -XX:MaxHeapSize
-Xms 等价于 -XX:InitialHeapSize
二、 查看jvm运行时参数
1. 输出参数变量信息
java -XX:+PrintFlagsFinal -version > flags.txt
2. jps
jsp -l
3. jinfo
查看最大内存 jinfo -flag MaxHeapSize 23789
查看垃圾回收器 jinfo -flag UseConcMarkSweepGc 23789
三、jstat查看JVM统计信息
1. 类装载
jstat -class 23789
jstat -gc 23789
S0C | 第一个幸存区的大小 |
S1C | 第二个幸存区的大小 |
S0U | 第一个幸存区的使用大小 |
S1U | 第二个幸存区的使用大小 |
EC | 伊甸园区的大小 |
EU | 伊甸园区的使用大小 |
OC | 老年代大小 |
OU | 老年代使用大小 |
MC | 方法区大小 |
MU | 方法区使用大小 |
CCSC | 压缩类空间大小 |
CCSU | 压缩类空间使用大小 |
YGC | 年轻代垃圾回收次数 |
YGCT | 年轻代垃圾回收消耗时间 |
FGC | 老年代垃圾回收次数 |
FGCT | 老年代垃圾回收消耗时间 |
GCT | 垃圾回收消耗总时间 |
2. 垃圾收集
jstat -gc 23789
3. JIT编译
jstat -compiler 23789
jstat -printcompilation 23789
四、jmap+MAT实战内存溢出
- 构建springboot 项目创建 接口 无限循环添加list 数据
五、如何导出内存印象文件
1. 内存溢出自动导出
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
-Xmx32m -Xmx32m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
设置堆栈信息
展示结果
到处文件设置 运行 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
展示结果
2. 使用jmap命令手动导出
jmap -dump:format=b,file=heap.hprof 23789
jmap -heap 23789
jps查看pid
不能生成文件的错我
37404: Unable to attach to 64-bit process
The -F option can be used when the target process is not responding
使用命令 jmap -heap pid
Error attaching to remote server: java.rmi.UnknownHostException: Unknown host: pid; nested exception is:
java.net.UnknownHostException: pid
sun.jvm.hotspot.debugger.DebuggerException: java.rmi.UnknownHostException: Unknown host: pid; nested exception is:
java.net.UnknownHostException: pid
at sun.jvm.hotspot.RMIHelper.lookup(RMIHelper.java:115)
at sun.jvm.hotspot.HotSpotAgent.connectRemoteDebugger(HotSpotAgent.java:517)
at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:374)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:183)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:196)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jmap.JMap.runTool(JMap.java:201)
at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: java.rmi.UnknownHostException: Unknown host: pid; nested exception is:
六、MAT内存分析
七、jstack实战死循环与死锁
jstack 23789 > 23789.txt
java线程状态
NEW | the thread has not yet started |
---|---|
WAITING | the stread is execution int |
RUNNABEL | the stread is blocked waiting for a monitor loacl |
TIMED-WAITING | the thread is bloacked waiting for another to preform anaction for |
BLOCKED | the thread is bloacked waiting for a monitor lock |
TERMINATED | the thread has exited |
八、 监控本地java进程 jvisualvm
1. 地址
C:\Program Files\Java\jdk1.8.0_92\bin
2. 页面样式
3. 插件中心下载
设置后安装
4. 监控远程tomcat
添加jmx 链接
5. 入门指南
九 、btrace
1. 简介
Btrace 基于动态字节码修改技术 (Hotswap) 来实现运行时 java 程序的跟踪和替换。Btrace 的脚本是用纯 java 编写的,基于一套官方提供的 annotation,使跟踪逻辑实现起来异常简单。
2. 地址
3. 使用
- 拦截方法
- 普通方法 @OnMethod(clazz=“”,method=“”)
- 构造函数 @OnMethod(clazz=“”,method=“”)
- 拦截时机
- Kind.ENTRY : 入口,默认值
- Kind.RETURN: 返回
- Kind.THROW:异常
- Kind.Line:行
- 拦截this、参数、返回值
- 简单类型:直接获取
- 复杂类型:反射,类名+属性名
- 其他
4. 说明
默认只能本地执行
生产环境下可以使用,但是被修改后的字节码不会被还原
十、tomcat性能监控
1. tomcat远程debug
2. tomcat-manager监控
-
tomcat-user.xml
<role rolename="tomcat"/> <role rolename="manager-status"/> <role rolename="manager-gui"/> <user name="admin" password="admin" roles="tomcat,manager-status,manager-gui"/>
-
在conf/Catalina/localhost/ 新增文件 manager.xml,内容如下
<?xml version="1.0" encoding="UTF-8"?> <Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1" />//127.0.0.1为允许远程链接的IP </Context>
3. psi-probe 监控
1. 地址
4. tomcat 优化
- 线程优化
-
配置优化
-
docs/config/context.html
reloadable : false
-
conf/server.xml
protpocol=“org.apache.coyote.http/1.1”
-
-
session优化
如果是jsp,可以禁用Session
附加参考
1. 快速创建项目
1. 生成项目链接
2.创建spring-web
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.maichen</groupId>
<artifactId>monito_tuning</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>monito_tuning</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>