JVM参数配置&&命令工具
JVM参数配置
大致方向:JVM调优的目的是保证在一定吞吐量的情况下尽可能的减少GC次数,从而减少系统停顿时间,提高服务质量和效率。
其中减少GC次数的原则:
- 将新生代转换成老年代的数量降至最少(及时进行Minor GC回收新生代)
- 减少Full GC 次数
常用参数
-XX:+PrintGCDetails:打印GC的详细信息(冒号之后的+表示打印,-表示不打印)
-XX:+UseSerialGC : 使用串行回收器
-Xmx4000m :指定堆最大值为4000M( 等价于-XX:MaxHeapSize)。默认物理内存的1/4
-Xms4000m :指定堆初始化值为4000M( 等价于-XX:initialHeapSize)。默认物理内存的1/64
-Xmn2000m :设置新生代大小为2000M。
-Xss512k:设置栈大小为512k
设置堆内存大小
- -Xmx :指定堆最大值。默认物理内存的1/4
- -Xms :指定堆初始化值。默认物理内存的1/64
推荐:通常会将 -Xmx 与 -Xms两个参数配置成相同的值
public class Main {
/**
*堆内存大小配置
* -Xmx4000m 设置最大堆内存为4000m
* -Xms4000m 设置初始化堆内存为4000m
* @param args
*/
public static void main(String[] args) {
System.out.println("堆最大内存:"+Runtime.getRuntime().maxMemory()/1024/1024);
System.out.println("可用内存:"+Runtime.getRuntime().freeMemory()/1024/1024);
System.out.println("内存总量:"+Runtime.getRuntime().totalMemory()/1024/1024);
}
}
设置栈大小
-Xss
- 设置单个线程栈的大小,一般默认为 512-1024k
- 等价于 -XX:ThreadStackSize
设置新生代大小
-Xmn :设置年轻代大小。
整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。
- 此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
设置元空间大小
元空间的本质和永久代类似,都是对 JVM 规范中的方法区的实现。
不过元空间于永久代之间最大区别在于,元空间并不在虚拟中,而是使用本地内存,因此默认情况下,元空间的大小仅受本地内存限制。
- 元空间的默认大小在20m左右,通常会调大一点。
-XX:MetaspaceDetails=1024m
新生代比例大小配置
-XX:SurvivorRatio=8 eden:from:to = 8:1:1 (default)
-XX:SurvivorRatio=2 eden:from:to = 2:1:1
public class Main {
/**
* 新生代比例大小配置
* -Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
* -Xmn1m 新生代最大可用值
*
*
*
* @param args
*/
public static void main(String[] args) {
byte[] b = null;
for (int i = 0; i < 10; i++) {
b = new byte[1 * 1024 * 1024];
}
}
}
新生代和老年代比例配置
-XX:NewRatio=2 新生代和老年代的占比为1:2 (default)
public class Main {
/**
* 新生代与老年代比例大小配置
*
* -XX:NewRatio=2 新生代和老年代的占比为1:2
*
* @param args
*/
public static void main(String[] args) {
byte[] b = null;
for (int i = 0; i < 10; i++) {
b = new byte[1 * 1024 * 1024];
}
}
}
设置垃圾的最大年龄
-XX:MaxTenuringThreshold=15(default)
新生代对象经过15次的回收就会进入老年代
小结
-Xmx4000m
-Xms4000m
-Xss1024k
-XX:MetaspaceSize=1024m
-XX:+PrintCommandLineFlags
-XX:+PrintGCDetails
//使用默认
-Xmn
-XX:SurvivorRatio
-XX:NewRatio
-XX:MaxTenuringThreshold
堆内存溢出问题
当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出
堆是存放对象的地方,那么只要在堆中疯狂的创建对象,那么堆就会发生内存溢出。
public class Main {
/**
*-Xms1m -Xmx1m -XX:+PrintGCDetails
*/
public static void main(String[] args) {
for (int i=0;i<100;i++)
{
Byte[] bytes = new Byte[1 * 1024 * 1024]; ///1M = 1024K = 1024*1024 字节
}
}
}
增大堆内存
-Xms100m -Xmx100m
栈溢出
通常产生于递归调用
public class Main {
/**
* -Xss10m
*/
private static int count;
public static void count()
{
// count++;
// count();
try
{
count++;
count();
}
catch (Throwable throwable)
{
System.out.println("最大深度:"+count);
}
}
public static void main(String[] args) {
count();
}
}
内存溢出和内存泄漏
内存溢出发生在申请堆内存空间时,内存不够用了。
比如你需要100M的空间,系统只剩90M了,这就叫内存溢出
内存泄漏是指创建一些对象,比如说IO流,数据库连接未关闭导致内存的持续占用,致使本该回收的内存空间依然被占用。而内存泄漏多了之后,就会导致内存溢出。
JVM命令工具
JVM常用命令
jps:JVM Process Status Tool 虚拟机进程状况工具
jps -l 输出主类全名,如果是Jar包,输出Jar包路径
-l : 输出主类全名或jar路径
-q : 只输出LVMID
-m : 输出JVM启动时传递给main()的参数
-v : 输出JVM启动时显示指定的JVM参数

jinfo:查看虚拟机各项参数
jps -l //获取LVMID
//查看打印GC日志的参数
jinfo -flag PrintGCDetails 12368
-XX:-PrintGCDetails
// 冒号后面的-表示未开启GC日志打印,+代表打印

查看MetaspaceSize初始值

- -flag : 输出指定args参数的值
- -flags : 不需要args参数,输出所有JVM参数的值
- -sysprops : 输出系统属性,等同于System.getProperties()
jstat:监视虚拟机运行时状态信息的命令
可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
命令格式
jstat [option] LVMID [interval] [count]
- [option] : 操作参数
- LVMID : 本地虚拟机进程ID
- [interval] : 连续输出的时间间隔
- [count] : 连续输出的次数
| 参数 | 含义 |
|---|---|
| -class | 监视类装载、卸载数量、总空间以及类装载所耗费的时间 |
| -gc | 监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息 |
| -gccapacity | 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间 |
| -gcutil | 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
| -gccause | 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
| -gcnew | 监视新生代GC状况 |
| -gcnewcapacity | 监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间 |
| -gcold | 监视老年代GC状况 |
| -gcoldcapacity | 监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间 |
| -gcpermcapacity | 输出永久代使用到的最大、最小空间 |
| -compiler | 输出JIT编译器编译过的方法、耗时信息 |
| -printcompilation | 输出已经被JIT编译的方法 |
-class
监视类装载、卸载数量、总空间以及耗费的时间
jstat -class 10524
Loaded Bytes Unloaded Bytes Time
610 1231.7 0 0.0 0.42
Loaded : 加载class的数量
Bytes : class字节大小
Unloaded : 未加载class的数量
Bytes : 未加载class的字节大小
Time : 加载时间
-----------------------------------------------------------------------------------
jstat -class 12036 1000 5 表示每1000毫秒查询一次,一共查询5次
C:\Users\Administrator>jstat -class 12036 1000 5
Loaded Bytes Unloaded Bytes Time
3252 3765.3 0 0.0 2.60
3252 3765.3 0 0.0 2.60
3252 3765.3 0 0.0 2.60
3252 3765.3 0 0.0 2.60
3252 3765.3 0 0.0 2.60
- -gc
垃圾回收堆的行为统计
jstat -gc 12036

C即Capacity 总容量,U即Used 已使用的容量
- S0C : survivor0区的总容量
- S1C : survivor1区的总容量
- S0U : survivor0区已使用的容量
- S1U : survivor1区已使用的容量
- EC : Eden区的总容量
- EU : Eden区已使用的容量
- OC : Old区的总容量
- OU : Old区已使用的容量
- PC 当前perm的容量 (KB)
- PU perm的使用 (KB)
- YGC : 新生代垃圾回收次数
- YGCT : 新生代垃圾回收时间
- FGC : 老年代垃圾回收次数
- FGCT : 老年代垃圾回收时间
- GCT : 垃圾回收总消耗时间
- -gccapacity
同-gc,不过还会输出Java堆各区域使用到的最大、最小空间
jstat -gccapacity 12036

- NGCMN : 新生代占用的最小空间
- NGCMX : 新生代占用的最大空间
- OGCMN : 老年代占用的最小空间
- OGCMX : 老年代占用的最大空间
- OGC:当前年老代的容量 (KB)
- OC:当前年老代的空间 (KB)
- PGCMN : perm占用的最小空间
- PGCMX : perm占用的最大空间
- -gcutil
同-gc,不过输出的是已使用空间占总空间的百分比
jstat -gcutil 12036
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
55.54 0.00 4.79 52.70 - - 50 0.823 6 0.068 0.891
- -gccause
垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
jstat -gccause 12036
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
55.54 0.00 7.99 52.70 - - 50 0.823 6 0.068 0.891 Allocation Failure No GC
- LGCC:最近垃圾回收的原因
- GCC:当前垃圾回收的原因
- -gcnew
统计新生代的行为
C:\Users\Administrator>jstat -gcnew 12036
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
13056.0 13056.0 7251.9 0.0 1 6 6528.0 104960.0 19574.8 50 0.823
- TT:Tenuring threshold(提升阈值)
- MTT:最大的tenuring threshold
- DSS:survivor区域大小 (KB)
- -gcnewcapacity
新生代与其相应的内存空间的统计
C:\Users\Administrator>jstat -gcnewcapacity 12036
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
131072.0 131072.0 131072.0 13056.0 13056.0 13056.0 13056.0 104960.0 104960.0 50 6
- NGC:当前年轻代的容量 (KB)
- S0CMX:最大的S0空间 (KB)
- S0C:当前S0空间 (KB)
- ECMX:最大eden空间 (KB)
- EC:当前eden空间 (KB)
- -gcold
监视老年代的GC状况
C:\Users\Administrator>jstat -gcold 12036
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
- - - - 131072.0 69073.6 50 6 0.068 0.891
- -gcoldcapacity
统计老年代的大小和空间
C:\Users\Administrator>jstat -gcoldcapacity 12036
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
131072.0 655360.0 131072.0 131072.0 50 6 0.068 0.891
- -printcompilation
输出已经被JIT编译的方法
C:\Users\Administrator>jstat -printcompilation 12036
Compiled Size Type Method
2537 30 1 java/io/ExpiringCache$1 removeEldestEntry
- Compiled:被执行的编译任务的数量
- Size:方法字节码的字节数
- Type:编译类型
- Method:编译方法的类名和方法名。类名使用”/” 代替 “.” 作为空间分隔符. 方法名是给出类的方法名. 格式是一致于HotSpot - XX:+PrintComplation 选项
jmap:生成堆转储快照
jmap -dump:live,format=b,file=dump.hprof 12233
format指定输出格式,live指明是活着的对象,file指定文件名
-heap
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
jmap -heap 28920
jhat: 分析jmap生成的dump
jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。
jstack: 用于生成java虚拟机当前时刻的线程快照
线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
- -F : 当正常输出请求不被响应时,强制输出线程堆栈
- -l : 除堆栈外,显示关于锁的附加信息
- -m : 如果调用到本地方法的话,可以显示C/C++的堆栈
jstack -F 12233
JVM可视化工具
位于JDK的bin目录下
JConsole
jconsole

VisualVM
jvisualvm


JVM参数配置&&命令工具的更多相关文章
- 查看指定java进程的jvm参数配置命令之jinfo
一.查看所有的参数 jinfo -flags PS:3739为JAVA进程ID Attaching to process ID , please wait... Debugger attached s ...
- 查看Java JVM参数配置信息命令
查看Java JVM参数配置信息命令 java -XX:+PrintCommandLineFlags jvm运行时状态的参数,可以很快找出问题所在.现在把几个命令记录一下:1. jstat这个命令对于 ...
- JVM性能优化--JVM参数配置,使用JMeter简单测试配合说明参数调优
一.JVM参数配置 1.常见参数配置 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 - ...
- JVM参数配置
JVM参数配置 设置堆大小 -Xms 初始堆大小 -Xmx 最大堆大小 -Xmn 设置年轻代大小 设置每个线程堆栈大小 -Xss 设置每个线程的堆栈大小 设置年轻代大小 -XX:NewSize= -X ...
- JVM参数配置 java内存区域
java内存区域 一些基本概念 http://www.importnew.com/18694.html https://www.cnblogs.com/wangyayun/p/6557851.html ...
- 一个性能较好的JVM参数配置
一个性能较好的web服务器jvm参数配置: -server//服务器模式-Xmx2g //JVM最大允许分配的堆内存,按需分配-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次 ...
- 一个性能较好的JVM参数配置(转)
一个性能较好的web服务器jvm参数配置: -server//服务器模式-Xmx2g //JVM最大允许分配的堆内存,按需分配-Xms2g //JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次 ...
- jvm参数及分析工具
-Xmx4G 设置堆的最大内存大小为4GB,也可通过-XX:MaxHeapSize=4GB进行设置 -Xms256m 设置堆的初始内存大小为256兆,如果未设置此选项,则初始大小将设置为新生代和年老代 ...
- JVM参数配置及内存调优
一.JVM常见参数配置 堆内存相关参数 参数名称 含义 默认值 -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40% ...
随机推荐
- python模块知识一 自定义模块、time、datetime时间模块
第五章 模块 1.自定义模块: 模块分类: 内置模块(标准库)-- python解释器自带的.py文件(模块) 第三方模块(各种大神写的)-- 需要额外下载(并发编程pypi) 自定义模块(自己写的) ...
- JSP数据交互(一)
1.JSP内置对象:JSP内置对象是 Web 容器创建的一组对象,不用通过手动new就可以使用 2.JSP9大内置对象: 对象名称 类型 request (请求对象) javax.servl ...
- 【MySQL】Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and ...
线上遇到这个问题,详细信息如下: SQL state [HY000]; error code [1267]; Illegal mix of collations (utf8mb4_general_ci ...
- 【iOS】获取视图的中心和宽高
示例代码: NSLog(@"%f, %f", self.view.center.x, self.view.center.y); NSLog(@"%f, %f", ...
- 四、Python基础(1)
目录 四.Python基础(1) 四.Python基础(1) 1.什么是变量? 一种变化的量,量是记录世界上的状态,变指得是这些状态是会变化的. 2.为什么有变量? 因为计算机程序的运行就是一系列状态 ...
- vue通信、传值的多种方式(详细)
转载自https://blog.csdn.net/qq_35430000/article/details/79291287
- Unity场景和代码合并以及UnityYAMLMerge的使用
1.首先是.gitignore的配置. # Folder config file Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ ...
- JAVA基础知识(三):input.nextLine() 和input.next()
next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其过滤掉:只有在读取到有效字符之后,next()方 ...
- 【0725 | Day 1】计算机编程/计算机组成原理/计算机操作系统
什么是编程 编程语言:人与计算机交流的手段 编程:通过编程语言编写文件 学习编程的目的:让计算机代替人力,为我们服务 计算机组成原理 计算机由五大部分组成:控制器.运算器.存储器.输入设备.输出设备. ...
- 不相交路径[BZOJ1471] 容斥原理 拓扑排序
最近学容斥的时候又碰到一道类似的题目,所以想分享一个套路,拿这题来举例 [题目描述] 给出一个\(N(N\leq 150)\)个结点的有向无环简单图.给出4个不同的点\(a,b,c,d\),定义不相交 ...