【JVM】JVM的配置参数以及常见异常
1 前言
了解了JVM的结构、运行时数据区的组成部分,继而了解一下JVM的一些常用配置参数。
2 参数分类以及常用命令
在Java虚拟机的参数中,有3种表示方法:
- 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
- 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
- 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用(但是,这些参数往往是非常有用的);
常用的命令:
- -verbose:class 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。
- -verbose:gc 输出每次GC的相关情况。
- -verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
- -XX:+PrintElagsInitial : 查看所有的参数的默认初始值
- -XX:+PrintFlagsFinal :查看所有的参数的最终值 (可能会存在修改不再是初始值)
3 运行时数据区常用配置及异常类型
3.1 方法区
(1)异常类型
- 当加载的类过多时,内存不足时 java.lang.OutofMemoryError:PermGen space(1.8以前)或者 java.lang.OutofMemoryError:Metaspace(1.8以后)
(2)参数配置
- -XX:PermSize 永久代的大小 默认值为物理内存的1/64 (1.8以前)
- -XX:MaxPermSize 永久代最大大小 默认为物理内存的1/4(1.8以前)
- -XX:MetaspaceSize 元空间大小 默认20M左右 (1.8及以后)
- -XX:MaxMetaspaceSize 元空间最大大小 默认无限制 (1.8及以后)
3.2 堆
(1)异常类型
- 内存不足时 java.lang.OutofMemoryError
(2)参数配置
- -Xms:初始堆空间内存 默认为物理内存的1/64
- -Xmx:最大堆空间内存 默认为物理内存的1/4
- -Xmn:设置新生代的大小(初始值及最大值) 默认值:堆内存的1/4
- -XX:NewRatio:配置新生代与老年代在堆结构的占比
- -XX:SurvivorRatio 设置新生代中Eden和SO/S1空间的比例
- -XX:MaxTenuringThreshold 设置新生代垃圾的最大年龄
- -XX:HandlePromotionFailure 设置空间分配担保
- -XX:UseTLAB 设置是否开启TLAB空间
- -XX:TLABWasteTargetPercent 设置TLAB空间所占用Eden空间的百分比大小
- -XX:+PrintGCDetails 输出详细的GC处理日志打印
3.3 本地方法栈
(1)异常类型
- 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个 StackOverFlowError。
- 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个 OutOfMemoryError。
3.4 虚拟机栈
(1)异常类型
- 如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError。
- 如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法中请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出-个 outofMemoryError。
3.5 程序计数器
无异常类型和配置