java常见面试考点
往期文章推荐:
java常见面试考点(十三):抽象类与接口的区别
java常见面试考点(十四):redis持久化
java常见面试考点(十五):什么时候建索引
java常见面试考点(十六):类加载器的常见考点
java常见面试考点(十七):为什么要去除永久代,换成元空间
【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权);
本博客的内容来自于:java常见面试考点(十八):JVM参数调优;
学习、合作与交流联系q384660495;
本博客的内容仅供学习与参考,并非营利;
文章目录
一、JVM的参数类型
1、标配参数
所有的JVM实现都必须实现这些参数的功能,而且向后兼容;在jdk各个版本之间很稳定,很少有大变化。比如:
-version
-help
-verbose:class 打印每个class信息
-verbose:gc 打印每次gc信息
-verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息
详细可以参考这篇文章JVM启动参数详解(含调优)
2、非标参数 (-X参数)
默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;比如:
-Xint 解释执行
-Xcomp 第一次使用就编译成本地代码
-Xmixed 混合模式
-Xloggc:file 与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。
若与verbose命令同时出现在命令行中,则以-Xloggc为准。
详细可以参考这篇文章JAVA启动参数大全之二:非标准参数
3、XX参数(重点)
-XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。如果此类参数设置合理将大大提高JVM 的性能及稳定性。此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
不稳定参数语法规则:
- 布尔类型参数值
-XX:+ '+'表示启用该选项
-XX:- '-'表示关闭该选项
参数及其默认值 | 描述 |
---|---|
-XX:-DisableExplicitGC | 禁止调用System.gc();但jvm的gc仍然有效 |
-XX:+MaxFDLimit | 最大化文件描述符的数量限制 |
-XX:+ScavengeBeforeFullGC | 新生代GC优先于Full GC执行 |
-XX:+UseGCOverheadLimit | 在抛出OOM之前限制jvm耗费在GC上的时间比例 |
-XX:-UseConcMarkSweepGC | 对老生代采用并发标记交换算法进行GC |
-XX:-UseParallelGC | 启用并行GC |
-XX:-UseParallelOldGC | 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用 |
-XX:-UseSerialGC | 启用串行GC |
-XX:+UseThreadPriorities | 启用本地线程优先级 |
-XX:+printGCDetails | 打印GC收集细节 |
- 数字类型参数值:
-XX:= 给选项设置一个数字类型值,可跟随单位,例如:'m’或’M’表示兆字节;'k’或’K’千字节;'g’或’G’千兆字节。32K与32768是相同大小的。
参数及其默认值 | 描述 |
---|---|
-XX:LargePageSizeInBytes=4m | 设置用于Java堆的大页面尺寸 |
-XX:MaxHeapFreeRatio=70 | GC后java堆中空闲量占的最大比例 |
-XX:MaxNewSize=size | 新生成对象能占用内存的最大值 |
-XX:MaxPermSize=64m | 老生代对象能占用内存的最大值 |
-XX:MinHeapFreeRatio=40 | GC后java堆中空闲量占的最小比例 |
-XX:NewRatio=2 | 新生代内存容量与老生代内存容量的比例 |
-XX:NewSize=2.125m | 新生代对象生成时占用内存的默认值 |
-XX:ReservedCodeCacheSize=32m | 保留代码占用的内存容量 |
-XX:ThreadStackSize=512 | 设置线程栈大小,若为0则使用系统默认值 |
-XX:+UseLargePages | 使用大页面内存 |
-XX:MetaspaceSize=128M | 设置元空间大小为128M |
-XX:MaxTenuringThreshold=15 | 该参数主要是控制新生代需要经历多少次GC晋升到老年代中的最大阈值 |
-Xms1024和-Xmx1024m其实都是-XX参数
-Xms 等价于-XX:InitialHeapSize
-Xmx等价于-XX:MaxHeapSize
- 字符串类型参数值:
-XX:= 给选项设置一个字符串类型值,通常用于指定一个文件、路径或一系列命令列表。
例如:-XX:HeapDumpPath=./dump.core
二、如何查看JVM默认值
方式一:jps+jinfo
先jps找到进程编号
jinfo -flag 具体参数 Java进程编号
jinfo -flags java进程编号
方式二:不稳定参数方式
java -XX:+PrintFlagsInitial -version 查看初始默认配置
java -XX:+PrintFlagsFinal -version 查看最终的配置信息
其中有冒号的是人为修改过参数
java -XX:+PrintCommandLineFlags -version 很重要的一个命令,一般用来查看垃圾回收器
三、G1参数样例
8核 8G内存,使用G1GC
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=4M
-XX:MaxTenuringThreshold=12
-XX:InitiatingHeapOccupancyPercent=40
-XX:ConcGCThreads=4 当前核心数的一半
-XX:+UseStringDeduplication
-XX:AutoBoxCacheMax=20000
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
-XX:+PrintPromotionFailure
-XX:+HeapDumpOnOutOfMemoryErro
-XX:HeapDumpPath=${LOGDIR}/java_pid${pid}.hprof
-Xloggc:/data/log/gc-myapp.log
-verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails
-XX:+DisableExplicitGC
四、查看堆内存大小
public static void main(String[] args) {
//获取当前堆的大小 byte 单位
long heapSize = Runtime.getRuntime().totalMemory();
System.out.println(heapSize);
//获取堆的最大大小byte单位
//超过将抛出 OutOfMemoryException
long heapMaxSize = Runtime.getRuntime().maxMemory();
System.out.println(heapMaxSize);
//获取当前空闲的内存容量byte单位
long heapFreeSize = Runtime.getRuntime().freeMemory();
System.out.println(heapFreeSize);
}
对于Java8来说,一般堆内存的初始容量为物理内存大小的1/64, 最大内存不超过物理内存的1/4或1G。
五、常用参数
-Xms 等价于-XX:InitialHeapSize 初始大小内存 ,默认为物理内存的六四分之一
-Xmx等价于-XX:MaxHeapSize 最大分配内存 ,默认为物理内存的四分之一
-Xss等价于-XX:ThreadStackSize 设置单个线程栈的大小,一般为512k~1024k。查看默认为0是代表使用该平台默认值
-XX:SurvivorRatio=8 设置Eden和s0/s1的比例,默认为8:1:1
-XX:NewRatio=2 配置年轻代与老年代在堆结构的占比,默认老年代占2
-XX:MaxTenuringThreshold=15 |该参数主要是控制新生代需要经历多少次GC晋升到老年代中的最大阈值
更多参数参考这篇文章工作中常用的 JVM 配置参数有哪些?和JVM常用参数