JVM-常用调优命令

1、java -XX:+PrintFlagsInitial -version > PrintFlagsInitial.txt    --- 查看jvm所有默认参数值

2、jps:查看当前java进程
        -l : 输出主类或jar的完全路径名
        -v : 输出jvm参数
        -m : 输出jvm启动时传递给main()的参数
    
3、jstat :  用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
            jstat命令格式 :jstat [Options] vmid [interval] [count] 
                Options, 一般使用 -gcutil 或 -gc 用于查看gc情况
                vmid是Java虚拟机ID,即当前运行的java进程号,在Linux/Unix系统上一般就是进程ID == pid
                interval, 间隔时间(单位为秒或毫秒)
                count,打印次数,如果省略则打印无数次
        Options 参数如下:
            -gc:统计 jdk gc时 heap信息,以使用空间字节数表示
            -gcutil:统计 gc时, heap情况,以使用空间的百分比表示
            -class:统计 class loader行为信息
            -compile:统计编译行为信息
            -gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况
            -gccause:统计引起 gc的事件
            -gcnew:统计 gc时,新生代的情况
            -gcnewcapacity:统计 gc时,新生代 heap容量
            -gcold:统计 gc时,老年代的情况
            -gcoldcapacity:统计 gc时,老年代 heap容量
            -gcpermcapacity:统计 gc时, permanent区 heap容量

列举:
            jstat -gc 1712 5000 5
            每 5000毫秒一次 显示进程号为 1712 的java进程的GC情况,一共生成5次 

S0C : survivorFrom 区的大小
S1C : survivorTO 区的大小
S0U : survivorFrom 区的使用大小
S1U : survivorTO 区的使用大小    
EC:eden区的大小
EU:eden区的使用大小
OC:老年代的大小
OU:老年代的使用大小    
MC:(Metaspace)元空间的大小,元空间实现了方法区
MU:元空间的使用大小    
CCSC:压缩类空间大小CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间    
FGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间     
CCS(compressed class space):压缩类空间,在64位平台上,HotSpot使用了两个压缩优化技术,Compressed Object Pointers (“CompressedOops”) 和 Compressed Class Pointers。压缩指针,指的是在 64 位的机器上,使用 32 位的指针来访问数据(堆中的对象或 Metaspace 中的元数据)的一种方式。32位的指针占用内存更小,有利于更好使用缓存。当然,在 64 位的机器中,最终还是需要一个 64 位的地址来访问数据的,所以这个 32 位的值是相对于一个基准地址的值。

4、jmap(Java Virtual Machine Memory Map): jdk提供的一个生成java虚拟机的堆转储快照dump文件的命令行工具。
        [option]
                -dump:live,format=b,file=dump.hprof 1712  --- 生成进程 【PID = 1712】的堆转储快照dump文件
                        live ---> 只转储活着的对象;没有指定则转储堆中的所有对象
                        format=b ---> 表示以hprof二进制格式转储java堆内存
                        file= ---> 用于指定快照dump文件的文件名
        使用MAT(Memory Anlysis Tool)分析dump文件(分析目标:程序是否内存泄露、程序大对象的占用是否合理、程序中部分对象产生的内存是否可以优化)
         mat下载:https://www.eclipse.org/mat/downloads.php

                -heap 1712  --- 打印heap的概要信息,GC使用的算法,heap的配置及wise heap 的使用情况。    JVM-常用调优命令_第1张图片

5、jstack : 用于生成java虚拟机当前时刻的线程快照,为虚拟机内每一条线程正在执行的方法堆栈的集合,用于定位线程出现长时间停顿的原因,诸如死锁、死循环等。
        jstack [option] PID
                [option]
                        -F : 当正常输出请求不被响应时,强制输出线程堆栈
                         -l : 除堆栈外,显示关于锁的附加信息
                       -m : 如果调用到本地方法的话,可以显示C/C++的堆栈
例:jstack -l 1712 | more >> jstack_1712.txt
线程周期状态:
        New: 创建线程对象的状态,此时线程仅仅是创建成功还未执行;
        Runnable:调用thread.start(),线程转变为Runnable。此刻进入线程抢占CPU阶段;
        Running:抢占CPU成功,线程开始执行;
        Waiting:调用了 thread.join() 或 锁对象调用了 obj.wait() 等就会进入Waiting状态,此刻线程需等待某个条件发生来唤醒自己;
        Timed_Waiting:调用了 Thread.sleep(long)、thread.join(long) 或 obj.wait(long) 等就会进入 Timed_Waiting 状态,与Waiting的区别在于Timed_Waiting的等待有时间限制;
        Blocked:如果进入同步方法或同步代码块,没有获取到锁,则会进入Blocked状态;
        Dead:线程执行完毕,或抛出了未捕获的异常之后,则会进入dead状态,表示该线程已结束。
                针对 jstack日志,注意点:
                        a、Deadlock ---> 死锁
                        b、Waiting on condition ---> 等待某个条件发生来唤醒,需分析是否处于sleep 或是 网络读写繁忙而等待。
                        c、in Object.wait() ---> 获取锁后又执行 obj.wait() 放弃锁

你可能感兴趣的:(jvm,java,开发语言)