JVM参数查看以及调优

JVM常用命令汇总:
jps:
 查看各个应用对应进程ID
Jmap:
 查看内存信息,实例个数以及占用内存大小
 jmap -heap 10200(进程ID)
 查看堆信息
jmap -dump:format=b,file=dump.hprof 10200(进程ID)
 手动转储堆内存信息
jvisualvm:
 启动jvisualvm,使用JvisualVM工具查看堆信息
启动jvisualvm
装载dump文件
查看
内存溢出的时候自动打印转存堆栈
 ‐XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:heapDump.dump 
 示例代码:
 JVM设置:-Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:heapDump.dump
import java.util.ArrayList;import java.util.List;
public class TestAutoDump {
    public static void main(String args[]) {
        List<byte[]> lists = new ArrayList<>();
        while(true) {
            byte[] bytes = new byte[1000*1024];
            lists.add(bytes);
        }
    }
}
// 运行结果如下:
[GC (Allocation Failure) [PSYoungGen: 1734K->488K(2560K)] 1734K->740K(9728K), 0.0007782 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1548K->504K(2560K)] 1800K->1780K(9728K), 0.0008307 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 2541K->488K(2560K)] 3817K->3780K(9728K), 0.0009803 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 2534K->504K(2560K)] 5826K->5804K(9728K), 0.0006492 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 504K->0K(2560K)] [ParOldGen: 5300K->5601K(7168K)] 5804K->5601K(9728K), [Metaspace: 3200K->3200K(1056768K)], 0.0045009 secs] [Times: user=0.16 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2044K->1000K(2560K)] [ParOldGen: 5601K->6601K(7168K)] 7645K->7601K(9728K), [Metaspace: 3202K->3202K(1056768K)], 0.0047187 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2006K->2000K(2560K)] [ParOldGen: 6601K->6597K(7168K)] 8607K->8597K(9728K), [Metaspace: 3209K->3209K(1056768K)], 0.0050641 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 2000K->2000K(2560K)] [ParOldGen: 6597K->6579K(7168K)] 8597K->8579K(9728K), [Metaspace: 3209K->3209K(1056768K)], 0.0049375 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:heapDump.dump ...
Heap dump file created [9656073 bytes in 0.018 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at TestAutoDump.main(TestAutoDump.java:9)
[Full GC (Ergonomics) [PSYoungGen: 2048K->0K(2560K)] [ParOldGen: 6619K->602K(7168K)] 8667K->602K(9728K), [Metaspace: 3240K->3240K(1056768K)], 0.0045889 secs] [Times: user=0.02 sys=0.02, real=0.02 secs] 
Heap
 PSYoungGen      total 2560K, used 20K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
  eden space 2048K, 1% used [0x00000000ffd00000,0x00000000ffd05228,0x00000000fff00000)
  from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
  to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
 ParOldGen       total 7168K, used 602K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
  object space 7168K, 8% used [0x00000000ff600000,0x00000000ff696b30,0x00000000ffd00000)
 Metaspace       used 3246K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 353K, capacity 388K, committed 512K, reserved 1048576K
Jstack:
 用来查找死锁
// 示例代码如下:public class DeadLockTest {
    public static void main(String args[]) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized(A.class) {
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (B.class) {
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized(B.class) {
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (A.class) {
                    }
                }
            }
        }).start();
    }
}
class A {}
class B {}
jstack 运行结果日志如下:jstack 14452
2019-11-09 13:08:54Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode):
"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x0000000000f6e800 nid=0x17c8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001e982800 nid=0x3cd4 waiting for monitor entry [0x000000002062f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at DeadLockTest$2.run(DeadLockTest.java:33)
        - waiting to lock <0x000000076b423028> (a java.lang.Class for A)
        - locked <0x000000076b6b2778> (a java.lang.Class for B)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0" #12 prio=5 os_prio=0 tid=0x000000001e971800 nid=0x45bc waiting for monitor entry [0x000000002052f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at DeadLockTest$1.run(DeadLockTest.java:16)
        - waiting to lock <0x000000076b6b2778> (a java.lang.Class for B)
        - locked <0x000000076b423028> (a java.lang.Class for A)
        at java.lang.Thread.run(Thread.java:748)
......
若程序是在本地运行,则我们可以使用jvisualvm自动检测死锁
 程序运行期间,使用命令jvisualvm打开工具
 jstack找出占用CPU最高的堆栈信息
 使用命令top -p 14552(java进程ID) 显示java的内存情况
 按H,获取每个线程的内存情况,找到占用CPU最高的线程tid
 转为十六进制得到 0x1371 ,此为线程id的十六进制表示
 执行 jstack 4977|grep -A 10 1371,得到线程堆栈信息中1371这个线程所在行的后面10行
 查看对应的堆栈信息找出可能存在问题的代码
Jinfo
 查看正在运行的java应用程序的扩展参数
Jstat
 jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。
 命令的格式如下:jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]
 jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况
 S0C:第一个幸存区的大小
 S1C:第二个幸存区的大小
 S0U:第一个幸存区的使用大小
 S1U:第二个幸存区的使用大小
 EC:伊甸园区的大小
 EU:伊甸园区的使用大小
 OC:老年代大小
 OU:老年代使用大小
 MC:方法区大小(元空间)
 MU:方法区使用大小
 CCSC:压缩类空间大小
 CCSU:压缩类空间使用大小
 YGC:年轻代垃圾回收次数
 YGCT:年轻代垃圾回收消耗时间,单位s
 FGC:老年代垃圾回收次数
 FGCT:老年代垃圾回收消耗时间,单位
 sGCT:垃圾回收消耗总时间,单位s
可以持续观察内存各部分的变化趋势,以及Young GC 和Full GC的频率,判断堆里面各个区域(Eden区域,S0,S1区域,以及Old区域)内存大小的合理性
 持续观察命令示例:
 jstat -gc 10200 1000 100
 观察线程10200的各个区域内存变化,以及GC情况,每一秒中打印一条日志,打印100次
 优化思路其实简单来说就是尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响
内存泄露:
 指的是对象已经不再使用,但是还在内存里面占用空间,且垃圾收集机制,无法回收该内存空间
 如何分析GC日志:
 GC日志的获取:
 应用程序配置自动转储GC信息:‐XX:+PrintGCDetails ‐XX:+PrintGCTimeStamps ‐XX:+PrintGCDateStamps ‐Xloggc:./gc.log
 GC 日志在线分析工具https://gceasy.io/
 分析GC日志免费,查看调优方案收费
分析结果如下图:
以上是 JVM参数查看以及调优 的全部内容, 来源链接: utcz.com/z/510592.html




