JVM实战
常用JVM查看信息命令
top
观察内存使用情况、CPU占用率,
top -Hp 进程ID
观察进程中的线程,哪个线程CPU和内存占比高,
jstack 进程ID
定位线程状况,重点关注:WAITING BLOCKED。
常用工具使用
- jconsole 远程连接
JDK自带界面 线上不使用,影响效率 略。 - jvisualvm 远程连接
JDK自带页面 线上不使用,影响效率 略。 - arthas
阿里巴巴出品,命令界面,不会影响效率。- 地址
https://arthas.aliyun.com/doc/quick-start.html - 常用命令
java -jar arthas-boot.jar
启动arthas,
dashboard
展示当前进程的信息以及堆使用情况,会一直进行打印堆信息。
jvm
观察jvm信息,
thread
定位线程问题,
jad
反编译。
- 地址
案例
package com.yxkj.jvm.basic;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @program:FoundationStudy
* @Author: zhuyang
* @Date: 2022/01/30/14:34
* @Description: GC分析
*/
public class FullGC_Problem {
private static class CardInfo {
BigDecimal price = new BigDecimal(0.0);
String name = "张三";
int age = 5;
Date birthdate = new Date();
public void m() {}
}
private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50,
new ThreadPoolExecutor.DiscardOldestPolicy());
public static void main(String[] args) throws Exception {
executor.setMaximumPoolSize(50);
for (;;){
modelFit();
Thread.sleep(100);
}
}
private static void modelFit(){
List<CardInfo> taskList = getAllCardInfo();
taskList.forEach(info -> {
// do something
executor.scheduleWithFixedDelay(() -> {
//do sth with info
info.m();
}, 2, 3, TimeUnit.SECONDS);
});
}
private static List<CardInfo> getAllCardInfo(){
List<CardInfo> taskList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
CardInfo ci = new CardInfo();
taskList.add(ci);
}
return taskList;
}
}
- 编译命令
javac –d . D:\zs\FullGC_Problem.java - 启动命令
java -Xms200m -Xmx200m -XX:+PrintGCDetails com.yxkj.jvm.basic.FullGC_Problem
日志分析
常见调优参数
-Xloggc:/opt/xxxx/logs/xxxx-xx-gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause -Xms60m -Xmx80m -XX:+UseG1GC
-Xloggc:/opt/xxxx/logs/xxxx-xx-gc-%t.log
: 打印日志如2022-02-20_21-56-03.log到logs目录下,不会每天新生成成一个日志,程序重启则新生成一个文件。-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause
:打印GC更详细以及产生原因。-Xms60m -Xmx80m
: 设置其最小堆大小为60m,Xmx60M:最大堆大小为80m。-XX:+UseG1GC
: 使用G1垃圾回收算法。
实际配置
-Xms3g -Xmx6g
tomcat配置参数
bin目录下 catalina.sh文件,找到/cygwin=false,在其上面进行配置:
JAVA_OPTS='-Xms4g -Xmx8G'
这两个参数一般够用了
堆内存分配JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
Gitee地址
参考
https://blog.csdn.net/sunyuhua_keyboard/article/details/125192869
https://blog.csdn.net/qq_39158142/article/details/89353936?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-89353936-blog-124288270.pc_relevant_recovery_v2&spm=1001.2101.3001.4242.1&utm_relevant_index=3
XFS