Fork me on GitHub

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

日志分析

image

image

常见调优参数

  • -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://gitee.com/zhuayng/foundation-study/blob/develop/JavaBasis/JVM/src/main/java/com/yxkj/jvm/basic/IndentityHashCode.java

参考

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

posted @ 2020-06-06 22:40  晨度  阅读(751)  评论(0编辑  收藏  举报