jvm的运行参数
三种参数类型
#标准参数
-help
-version
-server或者-client设置jvm的运行参数
-D设置系统属性
#-X参数(非标准参数)
1)-X参数是非标准参数,在不同版本的jvm中,参数可能会有所不同,可以通过java -X查看非标准参数
2)-Xint在解释模式(interpreted mode)下,-Xint标记会强制JVM执行所有的字节码,当然这会降低运行速度,通常低10倍或者更多
3)-Xcomp参数与它(-Xint)正好相反,JVM在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化
4)-Xmixed是混合模式,将解释模式与变异模式进行混合使用,有JVM自己决定,这就是JVM默认的模式,也是推荐使用的模式
#-XX参数(使用率较高)
-XX:newSize
-XX:+UseSerialGC
1)-XX参数也是非标准参数,主要用于JVM的调优和debug操作
2)-XX参数的使用有2种方式,一种是boolean类型,一种是非boolean类型
3)boolean类型
4)-Xms与-Xmx分别是设置JVM的堆内存的初始大小和最大大小,
设置初始化堆内存值大影响,对系统启动效率慢(因为在内部初始化扩容堆内存),运行效率快(后续扩容次数少),如果初始化堆内存设置过小,当堆内存满了需要扩容需要消耗大量的io资源进行内部扩容
5)-Xmx2048:等价于-XX:MaxHeapSize,设置JVM最大堆内存为2048
6)-Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M
#项目运行时候内存溢出记录溢出信息 HeapDumpOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
#查看JVM的运行参数
1)运行java命令时打印参数:需要添加-XX:+PrintFlagsFinal参数即可
#查看当前的运行项目参数信息
jinfo -flags 端口号
#查询当前的运行项目指定参数信息
jinfo -flag (参数InitialHeapSize)端口号
#JVM内存模型(年轻带、年老带、永久区都属于堆内存模型)
java 1.7模型
#年轻带(young Generation(-Xmn))
Eden区
S0 S1 轮询转换区
#老年带(Old Generation)
#永久区(Perm)
java 1.8模型(年轻带、年老带都属于堆内存模型,MetaData Space属于内存)
#年轻带(young Generation(-Xmn))
Eden区
S0 S1 轮询转换区
#老年带(Old Generation)
#MetaData Space(直接内存)
#为什么要废弃1.7中的永久区
1)官网给出解释
移出永久代是为了融合HotSpot JVM与JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代
#通过jstat命令进行查看堆内存的使用情况
1)jstat命令可以查看堆内存各部分的使用量,以及加载类的数量,命令的格式如下:
jstat [-命令选项][vimd][间隔时间/毫秒][查询次数]
2)查看class编译加载统计
jstat -class 进程号
3)查看compiler编译统计
jstat -compiler 进程号
4)查看gc回收统计
jstat -gc 进程号
可以看到S0区和S1区的相互转换
S0C:年轻代中第一个survivor(幸存区)的容量 (kb)
S1C:年轻代中第二个survivor(幸存区)的容量 (kb)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (kb)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (kb)
EC:年轻代中Eden(伊甸园)的容量 (kb)
EU:年轻代中Eden(伊甸园)目前已使用空间 (kb)
OC:Old代的容量 (kb)
OU:Old代目前已使用空间 (kb)
PC:Perm(持久代)的容量 (kb)
PU:Perm(持久代)目前已使用空间 (kb)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (kb)
NGCMX:年轻代(young)的最大容量 (kb)
NGC:年轻代(young)中当前的容量 (kb)
OGCMN:old代中初始化(最小)的大小 (kb)
OGCMX:old代的最大容量 (kb)
OGC:old代当前新生成的容量 (kb)
PGCMN:perm代中初始化(最小)的大小 (kb)
PGCMX:perm代的最大容量 (kb)
PGC:perm代当前新生成的容量 (kb)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (kb)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (kb)
ECMX:年轻代中Eden(伊甸园)的最大容量 (kb)
DSS:当前需要survivor(幸存区)的容量 (kb)(Eden区已满)
TT:持有次数限制
MTT :最大持有次数限制
#jmap的使用以及内存溢出分析
1)查看内存使用情况
jmap -heap 进程号
2)查看内存中对象数量及大小
jmap -histo 进程号 | more
3)查看内存中存活对象数量及大小
jmap -histo:live 进程号 | more
4)将内存使用情况dump到文件中
有些时候我们需要将jvm当前内存情况dump到文件中,然后对它进行分析,jmap也支持dump到文件中
jmap -dump:live,format=b,file=dumpFileName <pid>
5)通过jhat对dump文件进行分析
dump出来的二进制文件,不方便查看,这时候我们可以借助于jhat工具进行查看
jhat -port 运行端口 dump.bat
#通过MAT工具对dump文件进行分析
1)MAT工具介绍
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速,功能丰富的Java Heap分析工具,
它可以帮助我们查找内存泄漏和减少内存消耗,使用内存分析工具从众多的对象中分析,快速计算出在内存中对象的占用大小,
看看是谁阻止了垃圾器回收工作,并可以通过报表只管的查看到可能造成这种结果的对象 。
官网地址:https://www.eclipse.org/mat/
#jstack查看线程的使用情况
jstack 进程号
#jvisualvm的使用
1)使用jvisualvm能够监控线程,内存情况,查看方法的cpu时间和内存中的对象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由那几个对象分配出来的)jvisualvm使用简单,几乎0配置,功能还比较丰富的,几乎囊括了其他JDK自带命令的所有功能
2)JMX(Java Management Extensions,即Java管理扩展)是一个应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成系统、网络和服务管理应用