• 尚硅谷-JVM-性能监控与调优篇(P302~P381)


    第二篇字节码和类加载篇感觉用处不大,暂时跳过,直接开始性能监控和调优。但是是免费篇,讲的都是写工具、参数,实际案例比较少。

    视频地址:

    https://www.bilibili.com/video/BV1PJ411n7xZ?p=381&vd_source=510ec700814c4e5dc4c4fda8f06c10e8

    csdn csdn csdn csdn csdn


    🔥1.性能监控与调优篇

    ​ 分为性能监控(发现问题)、分析(排查问题)和调优(解决问题):最终目的还是要减少GC次数,保证系统性能

    1.1. 性能监控

    1.1.1 命令行监控
    1.1.1.1 jps

    java process status

    -- 查看Hotspot虚拟机中正在运行的进程: pid 进程名
    C:\Users\EDY>jps
    18736 Jps
    26500 RemoteMavenServer36
    14712 RemoteMavenServer36
    21452 Launcher
    39372
    46956 Launcher
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1.1.1.2 jstat

    监视虚拟机中运行状态:类加载,内存,垃圾收集等运行数据

    C:\Users\EDY>jstat -class 26500
    Loaded  Bytes  Unloaded  Bytes     Time
      5740 10533.0       25    25.2       2.23
    
    • 1
    • 2
    • 3
    1.1.1.3 jinfo

    查看、调节虚拟机配置参数信息

    --查看进程参数,也可以修改
    C:\Users\EDY>jinfo -flags 42872
    
    --增加参数
    C:\Users\EDY>jinfo -flag +PrintGCDetails 42872
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1.1.1.4 JVM默认值
    --JVM启动默认值
    C:\Users\EDY>java -XX:+PrintFlagsInitial >> 1.txt
    --JVM最终默认值,可能程序会修改
    C:\Users\EDY>java -XX:+PrintFlagsFinal >> 1.txt
    
    • 1
    • 2
    • 3
    • 4
    1.1.1.5 Jmap

    ​ 导出内存映像文件和内存使用情况

    1.1.2 GUI界面

    ​ GUI算是对命令行的升级。分为JDK自带和第三方工具

    1.1.2.1 Jconsole
    1.1.2.1 JvisualVM

    ​ dump文件:分析某个时刻内存、类个数、对象个数等信息情况

    ​ 抽样器:查看哪个线程占用CPU和内存过高的情况

    .hprof:就是dump里面对象个数情况

    ​ 浅堆:对象所消耗内存,不包含内部引用对象大小

    ​ 深堆:只能通过一个对象直接或间接访问到所有对象的浅堆之和(比如A对象中有多个对象,对象下面还有对象,A中除去多个对象后的大小就是浅堆,整个A对象包含多个对象下面的对象就是深堆,)

    ​ 实际对象大小:对象中所有对象之和

    image-20220728101413251

    1.1.3 JProfile(略)

    ​ 就是和idea整合的内存分析工具

    1.1.4 Arthas(略)

    1.2 性能分析

    1.2.1 内存泄漏
    1.2.1.1 static集合

    ​ 长生命周期引用持有短生命周期对象导致不能被回收,就会导致内存泄漏

        //statics生命周期和JVM一致, 程序结束之前不能被释放
        static List list = new ArrayList();
        public static void staticCollection(){
            Object o = new Object();
            list.add(o);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1.2.1.2 单例模式

    单例对象持有外部对象引用

    1.2.1.3 外部连接

    ​ 数据库连接,网络连接,IO连接,连接完了之后要关闭

    1.2.1.4 变量作用域

    能用局部变量的不要用全局变量

    1.2.1.5 hashCode值

    set.add一个对象后再把这个对象属性修改add,就会有2个相同属性的对象(因为刚开始计算hashcode是一个值,修改属性就会重新计算hashcode,因为底层是map,map存储元素就是拿hashcode来计算的),前一个对象就会造成内存泄漏,所以对于集合存了元素后,就不要再修改元素里面值了,类似redis和mysql关系

    1.3 性能调优

    1.3.1 JVM参数设置(略)

    第一篇讲了很多了,后面用到了在看。分为-X(稳定)与-XX(不怎么稳定)

    1.3.2 GC日志分析(略)

    1.4 个人小结

    总结,总的来说,本章分为一些命令行监控、GUI监控、第三方工具监控、JVM参数设置和日志监控,来分析代码写的是不是有问题,服务器配置是不是不行之类的。

  • 相关阅读:
    如果有一天你不开心
    QGIS编译(跨平台编译)之五十三:qgis_core库在linux QtCreator环境下编译的错误处理
    预览PDF并显示当前页数
    【XGBoost】第 5 章:XGBoost 揭幕
    Vue实现支持搜索和筛选的用户列表
    JavaScript高阶班之ES6 → ES11(八)
    nodejs 和 npm 版本对应关系
    时间显示(蓝桥杯)
    Linux系统 SSHD服务安全优化方案
    Python-生成随机数
  • 原文地址:https://blog.csdn.net/Empire_ing/article/details/126084211