文章目录
JVM参数类型大揭秘
JVM的参数类型
标准参数
在各个版本的JVM中基本保持不变,相对稳定
-
-help
-
-server -client
-
-version -showversion
-
-cp -classpath
X参数
非标准参数,在各个版本的JVM中可能会变,但是变化较小
- -Xint:解释执行
- -Xcomp:第一次使用就编译成本地代码
- -Xmixed:混合模式,JVM自己来决定是否编辑成本地代码
默认混合模式
设置为解释模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwYsLJlV-1585792192843)(C:\Users\sunmingzhi\AppData\Roaming\Typora\typora-user-images\1585728229372.png)]
设成编译模式
XX参数
-
特点:
- 非标准化参数化
- 相对不稳定
- 主要用于JVM调优和Debug
-
分类
-
Boolean
-
格式:-XX:[+ -]表示启用或者禁用name属性。其中+号表示启用该参数,-号表示禁用该参数
-
例子
-XX:+UseConcMarkSweepGC 表示启用了CMS垃圾收集器
-XX:+UseG1GC 表示启用了G1垃圾收集器
-
-
非Boolean
-
格式:-XX:=表示name属性的值是value,主要是以key,value形式存在
-
例子:
-XX:MaxGCPauseMillis=500 表示GC最大的停顿时间是500ms
-XX:GCTimeRatio=19 表示GCTimeRatio等于19
-
-
-
总结:
Boolean是带有±号,
Boolean类型是key,value形式存在,中间用等号。
-Xmx -Xms
一个是设置最大内存,一个是设置最小内存
-
不是X参数,而是XX参数
- –Xms等价于-XX:InitialHeapSize
- -Xmx等价于-XX:MaxHeapSize
- -Xss等价于-XX:ThreadStackSize
InitialHeapSize
初始堆的大小。MaxHeapSize
最大的堆大小。ThreadStackSize
线程堆栈大小- 查看运行后的进程,最大的堆大小值: jinfo -flag MaxHeapSize 33333
- 查看现场的堆栈大小: jinfo -flag ThreadStackSize 33333
-
默认情况不做修改的话,堆栈其中的一个线程就有1024k,这线程应该还是比较大的。我们在调优的时候还是会把这个值调小一些。
运行时JVM参数查看
参数:
-
-XX:+PrintFlagsInitial(查看初始值)
-
-XX:+PrinFlagsFinal(查看最终值)
=表示默认值
:=被用户或者JVM修改后
-
-XX:+UnlockExperimentalVMOptions(解锁实验参数)
-
-XX:+UnlockDiagnosticVMOptions(解锁诊断参数)
-
-XX:+PrintCommandLineFlags(打印命令行参数)
jps
-
类似Linux系统中的pa,也就是用来查看系统进程的,不过是专门用来查看java的进程
-
使用指南
jinfo
-
查看一个正在运行的JVM的参数值
-
查看tomcat的最大内存值:首先得知命令,然后找到对应的pid
jstat查看虚拟机统计信息
在垃圾回收这块十分有用,可以清楚的看到内存结构里每一块的大小是如何进行变化的
类装载
jstat -class 3176 1000 10
后面1000表示每隔1000ms,10表示一共输出10次
- -class
- Loaded:类装载的个数
- Bytes:装载的kBs数
- Unloaded:卸载的个数
- Bytes:卸载的kBs数
- Time:所花费的装载和卸载的时间
垃圾收集
命令:-gc 、-gcutil、-gccause、-gcnew、-gcold
- -gc
- S0C、S1C、S0U、S1U:S0和S1的总量与使用量
- EC、EU:Eden区总量与使用量
- OC、OU:Old区总量与使用量
- MC、MU:Metaspace区总量与使用量
- CCSC、CCSU:压缩类空间总量与使用量
- YGC、YGCT:YoungGC的次数与时间
- FGC、FGCT:FullGC的次数与时间
- GCT:总的GC时间
JIT编译
命令:-compiler、-printcompilation
- -compiler
- Compiled:表示完成了多少个编译任务
- Failed:表示失败的编译任务个数
- Invalid:表示无效的编译任务
- Time:执行编译任务所花的时间。
- FailedType:上次失败编译的编译类型。
- FailedMethod:上次编译失败的类名和方法。
jmap+MAT实战内存溢出
JVM内存结构
-
JVM的内存结构分为两个大块,
-
堆区
- Young
- Survivor
- S0
- S1
- Eden
- Survivor
- Old
- Young
-
非堆区:属于我们操作系统的本地内存,独立于我们堆区以外。在JDK8中叫Metaspace
-
查看线上堆内存溢出以及非堆内存溢出
发送内存溢出的主要原因
-
内存泄漏
- 导出内存映像文件
- 内存溢出自动导出
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./
- 第一个参数表示:当发生内存溢出的时候,将内存溢出文件Dump出来。
- 第二个参数表示:Dump出来的文件存放的目录。
- 使用jmap命令手动导出
发送内存溢出的主要原因
- 内存溢出自动导出
- 导出内存映像文件
-
内存泄漏
- 导出内存映像文件
- 内存溢出自动导出
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./
- 第一个参数表示:当发生内存溢出的时候,将内存溢出文件Dump出来。
- 第二个参数表示:Dump出来的文件存放的目录。
- 使用jmap命令手动导出
- 内存溢出自动导出
- 导出内存映像文件
-
内存分配不足