亲宝软件园·资讯

展开

Java JVM调优

恶魔的复活 人气:0

jmap查看内存信息

jmap histo /pid > ./log.txt :查看某一进程实例个数,占用内存的字节数,以及所属的类

jmap -heap /pid :查看堆信息

jmap ‐dump:format=b,file=app.hprof /pid

通过jvisualvm命令启动jvm可视化管理界面可导入dump文件进行分析:查看类的实例

jstack

分析死锁:写一段死锁代码

public class DeadLockTest {
    private final static Object lock1 = new Object();
    private final static Object lock2 = new Object();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1) {
                    try {
                        System.out.println(Thread.currentThread().getName() + ": get the lock1");
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (lock2) {
                        System.out.println(Thread.currentThread().getName() + ": get the lock2");
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock2) {
                    try {
                        System.out.println(Thread.currentThread().getName() + ": get the lock2");
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (lock1) {
                        System.out.println(Thread.currentThread().getName() + ": get the lock1");
                    }
                }
            }
        }).start();
    }
}

"Thread-1" 线程名;prio=5 优先级=5; tid=0x0000000019aa9000线程id; nid=0x6c4线程对应的本地线程标识nid; java.lang.Thread.State: BLOCKED 线程状态

启动 jvisualvm命令选择对应的进程即可查看到死锁的线程

Jstack分析CPU使用率高的线程堆栈信息

启动一个while循环,使CPU一直工作

1、top -p /pid:查看进程占用资源情况

显而易见该进程导致CPU使用率几乎100%。

2、按H查看进程内每个线程占用资源的情况

3、找到CPU使用近100%的PID这列,表示线程tid为5027,通过转换器转为16进制为13a3,

4、通过jstack命令执行jstack 5026|grep -A 10 13a3,即可得到线程tid为13a3的堆栈信息,进而找到导致CPU占用100%的执行行号

jinfo查看jvm系统参数

jinfo -flags /pid :查看jvm参数

jinfo -sysprops /pid:查看java的系统参数

Jstat查看堆内存使用和类加载的数量信息

jstat -gc /pid:垃圾回收统计

S0C:第一个幸存区的大小,单位KB; S1C:第二个幸存区的大小; S0U:第一个幸存区的使用大小;S1U:第二个幸存区的使用大小; EC:伊甸园区的大小; EU:伊甸园区的使用大小; OC:老年代大小; OU:老年代使用大小; MC:方法区大小(元空间) ;MU:方法区使用大小; CCSC:压缩类空间大小; CCSU:压缩类空间使用大小; YGC:年轻代垃圾回收次数; YGCT:年轻代垃圾回收消耗时间,单位s; FGC:老年代垃圾回收次数; FGCT:老年代垃圾回收消耗时间,单位s; GCT:垃圾回收消耗总时间,单位s

jstat -gccapacity/pid: 堆内存统计

NGCMN:新生代最小容量;NGCMX:新生代最大容量;NGC:当前新生代容量;S0C:第一个幸存区大小;S1C:第二个幸存区的大小;EC:伊甸园区的大小;OGCMN:老年代最小容量;OGCMX:老年代最大容量;OGC:当前老年代大小;OC:当前老年代大小;MCMN:最小元数据容量;MCMX:最大元数据容量;MC:当前元数据空间大小;CCSMN:最小压缩类空间大小;CCSMX:最大压缩类空间大小;CCSC:当前压缩类空间大小;YGC:年轻代gc次数;FGC:老年代GC次数

jstat -gcnew /pid:查看新生代垃圾回收统计

TT:对象在新生代存活的次数; MTT:对象在新生代存活的最大次数; DSS:期望的幸存区大小

jstat -gcnewcapacity/pid:查看新生代内存容量

S0CMX:最大幸存1区大小;S1CMX:最大幸存2区大小;ECMX:最大伊甸园区大小

jstat -gcold /pid:查看老年代垃圾回收统计

jstat -gcoldcapacity/pid:查看老年代内存容量

jstat -gcmetacapacity/pid:查看元数据空间统计

通过jstat gc -pid命令可以优化java应用的启动参数,jstat -gc pid 1000 10 (每隔1秒执行1次命令,共执行10次)预估每秒Eden区会新增多少对象,可根据具体结果调整时间。优化思路其实简单来说就是尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。

内存泄漏

对于一些老旧的数据,比如jvm级别的内存没有及时清理,导致数据越堆越多,时间长了就会频繁导致full gc,从而导致内存泄漏。可以使用成熟缓存架构ehcache,他们有实现LRU数据淘汰策略。

加载全部内容

相关教程
猜你喜欢
用户评论