Java JVM虚拟机调优详解

目录
  • jmap查看内存信息
  • jstack
  • jinfo查看jvm系统参数
  • Jstat查看堆内存使用和类加载的数量信息
  • 内存泄漏

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调优内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java JVM调优五大技能详解

    目录 1.什么时候需要JVM调优 2.JVM调优一般调什么 3.JVM调优基本步骤 3.1添加GC日志相关的参数 3.2添加内存溢出与Full gc前快照输出参数 3.3通过日志确定问题 3.3.1堆内存不足 3.3.2频繁Full gc 4.监控工具 4.1使用jstat 统计gc相关信息 4.2使用jmap命令查某时刻的JVM堆信息 5.常用的调优工具有哪些? 总结 1.什么时候需要JVM调优 应用的响应慢.CPU占用高 应用吞吐量小,占用内存空间过大 这些表象一般伴随着频繁的垃圾回收,或者

  • Java JVM原理与调优_动力节点Java学院整理

    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.是运行Java应用最底层部分. JDK(Java Development kit) 整个Java的核心,包括了Java运行环境(Java Runtime E

  • java虚拟机之JVM调优详解

    JVM常用命令行参数 1. 查看参数列表 虚拟机参数分为基本和扩展两类,在命令行中输入 JAVA_HOME\bin\java就可得到基本参数列表. 在命令行输入 JAVA_HOME\bin\java –X就可得到扩展参数列表. 2. 基本参数说明: -client,-server: 两种Java虚拟机启动方式,client模式启动比较快,但是性能和内存管理相对较差,server模式启动比较慢,但是运行性能比较高,windos上采用的是client模式,Linux采用server模式 -class

  • 优化Java虚拟机总结(jvm调优)

    堆设置 -Xmx3550m:设置JVM最大堆内存为3550M. -Xms3550m:设置JVM初始堆内存为3550M.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. -Xss128k:设置每个线程的栈大小.JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K.应当根据应用的线程所需内存大小进行调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右. -Xmn2g:设置堆

  • Java JVM虚拟机调优详解

    目录 jmap查看内存信息 jstack jinfo查看jvm系统参数 Jstat查看堆内存使用和类加载的数量信息 内存泄漏 jmap查看内存信息 jmap histo /pid > ./log.txt :查看某一进程实例个数,占用内存的字节数,以及所属的类 jmap -heap /pid :查看堆信息 jmap ‐dump:format=b,file=app.hprof /pid 通过jvisualvm命令启动jvm可视化管理界面可导入dump文件进行分析:查看类的实例 jstack 分析死锁

  • Java reservedcodecachesize虚拟机参数案例详解

    一.reservedcodecachesize参数介绍 该参数是JvM虚拟机调优中调整内存大小的一个设置参数,值得大小设置直接影响到Code Cache的大小,而jvm编译的代码有常常存放在Code Cache中,而Code Cache的空间内存又支撑着jvm的正常运行,如果该空间不足jvm虚拟机将会发生问题,并且性能持续降低. Code Cache就是所谓的代码缓存,由于JVM虚拟机的内存默认是有大小限制的,因此代码缓存区域肯定也是有一定大小限制,一般的Windows电脑上64位系统下它的默认

  • Java JVM编译策略案例详解

    解释器 当虚拟机启动时,解释器可以首先发挥作用,而不必等待编译器全部编译完成再执行,这样可以省去许多不必要的编译时间.并且随着程序运行时间的推移,编译器逐渐发挥作用,根据热点探测功能,,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率. hotspot中内嵌有2个JIT编译器,分别为Client Compiler,Server Compiler,但大多数情况下我们称之为C1编译器和C2编译器. C1编译器 client compiler,又称C1编译器,较为轻量,只做少量性能开销比较

  • G1垃圾回收器在并发场景调优详解

    目录 序言 G1概览 1.最大堆大小 2.Region大小 3.获取默认值 三种GC模式 1.新生代回收 2.混合回收 3.Full GC 默认参数 1.堆内存 2.新生代内存回收 3.混合回收 垃圾在堆中流转 1.对象如何进入老年代 (1)大对象直接到老年代 (2)动态年龄判断 2.高并发加速进入老年代 调优步骤 1.设置垃圾回收器 2.设置堆大小 3.元空间设置 4.GC停顿时间 5.新生代大小 调优实践 1.频繁的YGC 2.频繁的Mixed GC (1)大对象 (2)元空间 3.Full

  • jvm虚拟机类加载机制详解

    目录 1 概述 2 类的加载时机 3 类的加载过程 3.1 加载 3.2 验证 3.3 准备 3.4 解析 3.5 初始化 4 类加载器 4.1 双亲委派模型 4.2 破坏双亲委派模型 1 概述 ​ Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验.转化解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程称为虚拟机的类加载机制.在Java语言中,类型的加载.连接和初始化都是在程序运行期间完成的. 2 类的加载时机 ​ 一个类型从被加载到虚拟机内存中开始,到

  • python机器学习朴素贝叶斯算法及模型的选择和调优详解

    目录 一.概率知识基础 1.概率 2.联合概率 3.条件概率 二.朴素贝叶斯 1.朴素贝叶斯计算方式 2.拉普拉斯平滑 3.朴素贝叶斯API 三.朴素贝叶斯算法案例 1.案例概述 2.数据获取 3.数据处理 4.算法流程 5.注意事项 四.分类模型的评估 1.混淆矩阵 2.评估模型API 3.模型选择与调优 ①交叉验证 ②网格搜索 五.以knn为例的模型调优使用方法 1.对超参数进行构造 2.进行网格搜索 3.结果查看 一.概率知识基础 1.概率 概率就是某件事情发生的可能性. 2.联合概率 包

  • Java JVM中线程状态详解

    目录 线程在JVM中的状态 线程在JVM中的状态转换 前言: 在Java面试中,线程的状态也是被经常考察的知识点,今天我们就来聊一聊线程状态的那些事! 线程在JVM中的状态 查看线程在JVM中有哪些不同的状态,最简单的方式是查看Jdk源码的Thread.State类.以下内容来自JDK文档.在JVM中,一个线程可能处于下面的六种状态中的一种: NEW A thread that has not yet started is in this state. 没有开始执行的线程处于这种状态 RUNNA

  • 关于redis状态监控和性能调优详解

    前言 对于任何应用服务和组件,都需要一套完善可靠谱监控方案. 尤其redis这类敏感的纯内存.高并发和低延时的服务,一套完善的监控告警方案,是精细化运营的前提. 本文主要给大家介绍了关于redis状态监控和性能调优的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1.redis-benchmark redis基准信息,redis服务器性能检测 例如: 检测redis服务器性能,本机6379端口的实例,100个并发连接,100000个请求 redis-benchmark

  • Java 虚拟机(JVM)之基本概念详解

    1.类加载子系统:负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间. 2.方法区:就是存放类信息.常量信息.常量池信息.包括字符串字面量和数字常量等.方法区是辅助堆栈的块永久区,解决堆栈信息的产生,是先决条件. 3.Java堆:再java虚拟机启动的时候建立Java堆,它是java程序最主要的内存工作区域,几乎所有的对象实例都存放到Java堆中,堆空间是所有线程共享的.堆解决的是数据存储问题,即数据怎么放.放在哪儿. 4.直接内存:Java的NIO库允许Ja

随机推荐