Java JVM虚拟机调优详解

 更新时间:2022年07月19日 16:58:37   作者:恶魔的复活  
JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,本文主要介绍了jvm调优,感兴趣的小伙伴们可以参考一下<BR>

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

到此这篇关于Java JVM虚拟机调优详解的文章就介绍到这了,更多相关Java JVM调优内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Servlet 实现网页重定向的方法

    浅谈Servlet 实现网页重定向的方法

    本篇文章主要介绍了Servlet 实现重定向几种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java实现将txt文件转成xls文件的方法

    Java实现将txt文件转成xls文件的方法

    今天小编就为大家分享一篇Java实现将txt文件转成xls文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Java如何随机生成图片验证码

    Java如何随机生成图片验证码

    这篇文章主要为大家详细介绍了Java如何随机生成图片验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 浅谈Java 代理机制

    浅谈Java 代理机制

    Java 有两种代理方式,一种是静态代理,另一种是动态代理。如果我们在代码编译时就确定了被代理的类是哪一个,那么就可以直接使用静态代理;如果不能确定,那么可以使用类的动态加载机制,在代码运行期间加载被代理的类这就是动态代理
    2021-06-06
  • 使用IDEA搭建ssm框架的详细图文教程

    使用IDEA搭建ssm框架的详细图文教程

    这篇文章主要介绍了使用IDEA搭建ssm框架的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 在IDEA中实现同时运行2个相同的java程序

    在IDEA中实现同时运行2个相同的java程序

    这篇文章主要介绍了在IDEA中实现同时运行2个相同的java程序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java实现JDBC向数据库批量插入

    Java实现JDBC向数据库批量插入

    在Java项目中可能会出现大量向数据库中插入的情况,本文主要介绍了Java实现JDBC向数据库批量插入,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Java Stream对象并行处理方法parallel()代码示例

    Java Stream对象并行处理方法parallel()代码示例

    在Java中Stream是一种用于处理集合数据的流式操作API,它提供了一种简洁、灵活、高效的方式来对集合进行各种操作,下面这篇文章主要给大家介绍了关于Java Stream对象并行处理方法parallel()的相关资料,需要的朋友可以参考下
    2023-11-11
  • JMX监控的具体使用

    JMX监控的具体使用

    JMX最常见的场景是监控Java程序的基本信息和运行情况,本文主要介绍了JMX监控的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java实现lucene搜索功能的方法(推荐)

    Java实现lucene搜索功能的方法(推荐)

    下面小编就为大家带来一篇Java实现lucene搜索功能的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论