java常见面试考点(十八):JVM参数调优

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实现会有所不同,将来可能会随时取消,需要慎重使用;
不稳定参数语法规则:

  1. 布尔类型参数值
    -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收集细节
  1. 数字类型参数值:
    -XX:= 给选项设置一个数字类型值,可跟随单位,例如:'m’或’M’表示兆字节;'k’或’K’千字节;'g’或’G’千兆字节。32K与32768是相同大小的。
参数及其默认值描述
-XX:LargePageSizeInBytes=4m设置用于Java堆的大页面尺寸
-XX:MaxHeapFreeRatio=70GC后java堆中空闲量占的最大比例
-XX:MaxNewSize=size新生成对象能占用内存的最大值
-XX:MaxPermSize=64m老生代对象能占用内存的最大值
-XX:MinHeapFreeRatio=40GC后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

  1. 字符串类型参数值:
    -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常用参数

参考文献

JVM启动参数详解(含调优)
JVM调优参数大全及G1GC调优

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的爱人是绿色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值