java参数:
-
-开头, 标准参数
-
-X开头, 非标参数
-
我们调优的参数, -XX
参数如下
java -XX:+PrintCommandLineFlags -version
。 打印java虚拟机启动的时候, 自带了一些参数, 打印这些参数。
[root@iZ2ze1zeijykeg3hjbji2dZ java]# java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=30115712 -XX:MaxHeapSize=481851392 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
----------------------------------------------
-XX:InitialHeapSize=30115712 起始堆内存大小
-XX:MaxHeapSize=481851392 最大堆内存占多少
-XX:+UseCompressedOops 使用压缩的类对象指针
java -XX:+PrintFlagsFinal -version
查看参数
一共739个
什么是调优?
1.根据需求进行JVM规划和调优
2.优化运行JVM运行环境(慢, 卡顿)
3.解决JVM运行过程中出现的各种问题(OOM)
样例
运行命令
:
java -Xms30M -Xmx30M -XX:+PrintGC -jar jdkStudy.jar
public class testMain {
private static class CardInfo {
BigDecimal price = new BigDecimal(0.0);
String name = "陈坤";
int age = 5;
Date BirthDay = new Date();
public void m(){
}
}
private static ScheduledThreadPoolExecutor executor =
new ScheduledThreadPoolExecutor(50,
new ThreadPoolExecutor.DiscardOldestPolicy());
public static void main(String[] args) throws InterruptedException {
executor.setMaximumPoolSize(50);
for(;;){
modeFit();
Thread.sleep(100);
}
}
private static void modeFit(){
List<CardInfo> taskList = getAllCardInfo();
taskList.forEach(cardInfo -> {
executor.scheduleWithFixedDelay(()->{
cardInfo.m();
}, 2, 3, TimeUnit.SECONDS);
});
}
private static List<CardInfo> getAllCardInfo(){
List<CardInfo> taskList = new ArrayList<>();
for(int i = 0; i < 100; i++){
CardInfo cardInfo = new CardInfo();
taskList.add(cardInfo);
}
return taskList;
}
}
jstack 27949 | more 列出进程里面所有的线程都列出来
jmap -histo 30989 | head -20 把对象列出来
jmap -histo 30989 | head -20
查看内存的问题, 内存泄漏
用arthas
观察cpu彪高的问题, 可以看见具体是那个线程占CPU多
下载地址: wget https://alibaba.github.io/arthas/arthas-boot.jar
GPU彪高, 看看是不是GC, 是GC的话, 可以是OOM问题, 也有可能是工作线程的问题。
arthas的命令
thread -b
: 找死锁, 一次命令就找到。