Java虚拟机(四) —— 调优工具与调优案例

调优工具

jinfo

查看JVM参数

jinfo -flags [pid]

可以看出ParallelGC是Java8的JVM的默认垃圾收集器。

查看java系统参数

jinfo -sysprops [pid]

jstat

类加载数量

jstat -class [pid]

列名 含义
Loaded 加载class的数量
Bytes 所占空间的大小
Unloaded 未加载的数量
Bytes 未加载的类占用的空间
Time 加载的用时

列名 参数 含义
S0 0.00 Servivor0 区使用的空间
S1 50.04 Servivor1 区使用的空间
E 27.75 Eden区使用的空间
O 0.01 Old区使用的空间
M 98.12 Metaspace 元空间
CCS 95.67 压缩类空间利用率为百分比
YGC 1 Young GC 也就是MinorGC,程序运行以来MinorGC发生的次数
YGCT 0.006 MinorGC的总耗时
FGC 0 程序运行以来FullGC发生的次数
FGCT 0.000 FullGC的总耗时
GCT 0.006 MinorGC + FullGC的总耗时

jmap

jmap -histo [pid]

jmap -heap [pid]

visual vm

jvisualvm

调优案例

使用快照分析OOM异常

运行参数

-Xms10M
-Xmx10M
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/Test/oom.dump

运行程序

class User{

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public User(String id) {
        this.id = id;
    }
}
public class OOMTest {

    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        for(;;){
            userList.add(new User(UUID.randomUUID().toString()));
        }
    }

}

运行结果

使用加载heap文件的方式,导入到visualvm中。可以看出User的实例过多,导致的OOM。

使用jstack、visualvm排查死锁程序

public class DeadLockTest {

    public static void main(String[] args) {

        Object lock1 = new Object();
        Object lock2 = new Object();

        new Thread(() -> {
                synchronized (lock1){
                    System.out.println("A get lock1");
                    try {
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (lock2){
                        System.out.println("A get lock2");
                    }
                }
            System.out.println("A finish");
        }).start();

        new Thread(() -> {
            synchronized (lock2){
                System.out.println("B get lock2");
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println("B get lock2");
                }
            }
            System.out.println("B finish");
        }).start();
    }

}

使用jstack [pid]可以看到线程的堆栈信息,而且如果存在死锁,会有提示。

使用visualvm也是一样的

jstack占用CPU最高的堆栈信息

dir

posted @ 2016-09-23 00:59  清泉白石  阅读(974)  评论(0编辑  收藏  举报