JVM内存分析

作者: Suny____ | 来源:发表于2020-02-14 22:35 被阅读0次

    JVM常用命令

    • jps 查看所有的java进程ID
    • jinfo 实时查看和调整JVM配置参数
      • 查看
        • jinfo -flag <name> <PID> 查看某个java进程的name属性的值
        • jinfo -flag MaxHeapSize PID
        • jinfo -flag UseG1GC PID
      • 修改
        • 参数只有被标记为manageable的flags可以被实时修改
        • jinfo -flag [+|-] PID
        • jinfo -flag <name>=<value> PID
      • 查看曾经赋过值的一些参数
        • jinfo -flags PID
    • jstat 查看虚拟机性能统计信息
      • 查看类装载信息
        • jstat -class PID 1000 10 查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10
      • 查看垃圾收集信息
        • jstat -gc PID 1000 10
    • jstack 查看线程堆栈信息
      • jstack PID 可以通过该命令排查线程的执行状态、死锁等
    • jmap 可以生成堆转储快照和打印出堆内存相关信息
      • 打印出堆内存相关信息
        • -XX:+PrintFlagsFinal -Xms300M -Xmx300M
        • jmap -heap PID
        • 可以看到堆内存中老年代新生代的内存分配情况
      • dump出堆内存相关信息
        • jmap -dump:format=b,file=<heap.hprof> PID 文件名自定义,后缀名固定
      • 堆内存溢出的时候自动dump
        • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof

    JVM常用工具

    • jconsole
      • JConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用情况、类加载情况等。
      • 命令行中输入:jconsole
    • jvisualvm
      • 可以监控本地、远程的java进程的CPU,类,线程等
      • 监控远端Java进程
        • 在visualvm中选中“远程”,右击“添加”
        • 主机名上写服务器的ip地址,比如111.11.11.111,然后点击“确定”
        • 右击该主机“111.11.11.111”,添加“JMX”[也就是通过JMX技术具体监控远端服务器哪个Java进程]
        • 要想让服务器上的tomcat被连接,需要改一下 bin/catalina.sh 这个文件
        JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote 
        -Djava.rmi.server.hostname=<111.11.11.111>
        -Dcom.sun.management.jmxremote.port=<8998>
        -Dcom.sun.management.jmxremote.ssl=false 
        -Dcom.sun.management.jmxremote.authenticate=true
        -Dcom.sun.management.jmxremote.access.file=<../conf/jmxremote>.access 
        -Dcom.sun.management.jmxremote.password.file=<../conf/jmxremote>.password"
        
        • 在 ../conf 文件中添加两个文件jmxremote.access和jmxremote.password
        jmxremote.access 文件 设置权限
        guest readonly
        manager readwrite
        
        jmxremote.password 文件 设置账号密码
        guest guest
        manager manager
        
        授予权限 : chmod 600 *jmxremot*
        
        • 将公网ip地址映射为服务器本地ip
        vim /etc/hosts
        192.168.1.177 111.11.11.111
        
        • 设置上述端口对应的阿里云安全策略和Linux防火墙策略
        • 启动tomcat
        • jvisualvm连接
    • Arthas
      • Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器
      • 常用命令
        version:查看arthas版本号
        help:查看命名帮助信息
        cls:清空屏幕
        session:查看当前会话信息
        quit:退出arthas客户端
        ---
        dashboard:当前进程的实时数据面板
        thread:当前JVM的线程堆栈信息
        jvm:查看当前JVM的信息
        sysprop:查看JVM的系统属性
        ---
        sc:查看JVM已经加载的类信息
        dump:dump已经加载类的byte code到特定目录
        jad:反编译指定已加载类的源码
        ---
        monitor:方法执行监控
        watch:方法执行数据观测
        trace:方法内部调用路径,并输出方法路径上的每个节点上耗时
        stack:输出当前方法被调用的调用路径
        
    • MemoryAnalyzer
      • Java堆分析器,用于查找内存泄漏
      • Heap Dump,称为堆转储文件,是Java进程在某个时间内的快照
      • 获取Dump文件
        • 手动 jmap -dump:format=b,file=heap.hprof PID
        • 自动 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
      • 使用
        • Histogram 可以列出内存中的对象,对象的个数及其大小
          • Class Name:类名称,java类名
          • Objects:类的对象的数量,这个对象被创建了多少个
          • Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用
          • Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和
          • 右击类名--->List Objects--->with incoming references--->列出该类的实例
          • 右击Java对象名--->Merge Shortest Paths to GC Roots--->exclude all --->找到GC Root以及原因
        • Leak Suspects 查找并分析内存泄漏的可能原因
          • Reports--->Leak Suspects--->Details
        • Top Consumers 列出大对象
    • GC日志分析工具
      • 要想分析日志的信息,得先拿到GC日志文件才行,所以得先配置一下
      • -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log
      • 在线
      • 本地
        • GCView
          • Summay--->Throughput 吞吐量
          • pause---> 停顿时间
          • Event Details中查看GC次数 total

    相关文章

      网友评论

        本文标题:JVM内存分析

        本文链接:https://www.haomeiwen.com/subject/pljsfhtx.html