栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

jvm调优实战

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

jvm调优实战

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数据淘汰策略。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926867.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号