JVM---JVM参数
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC
参数选项类型
/**
* <JVM参数-参数选项类型>
* 1、标准参数
* 特点:
* 以 - 开头;
* 稳定,后续版本基本不会变化;
* 参数:
* java 命令可以查看
*
* 2、-X参数
* 特点:
* 以 -X 开头
* 非标准化参数;
* 功能还算稳定,后续版本可能会变更;
* 参数:
* java -X命令可以查看
* eg:
* -Xms<size> 等价于-XX:InitialHeapSize
* -Xmx<size> 等价于-XX:MaxHeapSize
* -Xss<size> 等价于-XX:ThreadStackSize
* -Xloggc:<file>
* -Xmixed
* -Xint
*
* 3、-XX参数
* 特点:
* 以 -X 开头
* 非标准化参数;
* 实验性参数,不稳定;
* 使用最多;
*
* 作用:
* 开发、调试JVM;
*
* 分类:
* Boolean类型:
* -XX:+<option> 开启、-XX:-<option> 关闭
* eg: -XX:+PrintFlagsFinal
* 输出所有参数名和值
*
* k-v类型:
* a, 数值类型
* -XX:<option>=<number>
* number可以带单位:
* 兆(m, M)、kb(k, K)、g(g, G)
* b, 非数值类型
* -XX:<option>=<string>
* eg:-XX:HeapDumpPath=/usr/local/...
*/
添加JVM参数
/**
* <JVM参数-添加JVM参数>
*
* <jar包运行>
* java [JVM参数] -jar xxx.jar
*
* <war包在Tomcat运行>
* linux:
* 在tomcat/bin/catalina.sh中添加配置,JAVA_OPTS="-Xms10m -Xmx20m..."
*
* windows:
* 在catalina.bat中添加配置,set "JAVA_OPTS=-Xms10m -Xmx20m..."
*
* <程序运行过程中>
* 非boolean类型:
* jinfo -flag <name>=<value> 进程ID
*
* boolean类型:
* jinfo -flag [+/-]<name> 进程ID
*
* ***注意:并非所有的参数在运行时都允许被修改
* 查看标记为可以运行时修改的参数:
* java -XX:+PrintFlagsFinal -version | grep manageable
*
* intx CMSAbortablePrecleanWaitMillis = 100 {manageable}
* intx CMSTriggerInterval = -1 {manageable}
* intx CMSWaitDuration = 2000 {manageable}
* bool HeapDumpAfterFullGC = false {manageable}
* bool HeapDumpBeforeFullGC = false {manageable}
* bool HeapDumpOnOutOfMemoryError = false {manageable}
* ccstr HeapDumpPath = {manageable}
* uintx MaxHeapFreeRatio = 100 {manageable}
* uintx MinHeapFreeRatio = 0 {manageable}
* bool PrintClassHistogram = false {manageable}
* bool PrintClassHistogramAfterFullGC = false {manageable}
* bool PrintClassHistogramBeforeFullGC = false {manageable}
* bool PrintConcurrentLocks = false {manageable}
* bool PrintGC = false {manageable}
* bool PrintGCDateStamps = false {manageable}
* bool PrintGCDetails = false {manageable}
* bool PrintGCID = false {manageable}
* bool PrintGCTimeStamps = false {manageable}
*/
常用JVM参数
/**
* <JVM参数-常用JVM参数>
* <打印设置的参数值>
* -XX:+PrintFlagsInitial
* 打印所有参数的默认值
*
* -XX:+PrintCommandLineFlags
* 在程序运行前,打印出用户设置或JVM自动设置的参数值;
*
* -XX:+PrintFlagsFinal
* 打印参数在运行时生效的值;
*
* -XX:+PrintVMOptions
* 打印JVM参数
*
* jps + jinfo
* 查看指定参数的值(jinfo -flag JVM参数 进程ID)
*
* <堆-栈-方法区参数>
* 1、栈
* -Xss10k
* 设置每个栈内存大小(等价于 -XX:ThreadStackSize=10k)
*
* 2、堆
* <整堆大小>
* -Xms10k
* 设置堆初始内存大小(等价于 -XX:InitialHeapSize=10k)
*
* -Xmx10k
* 设置堆最大内存大小(等价于 -XX:MaxHeapSize=10k)
*
* <新生代>
* 1、整新生代
* -Xmn10m
* 设置新生代内存大小(等价于 -XX:NewSize=10m + -XX:MaxNewSize=10m)
* 官方推荐:新生代为整堆的3/8;
*
* -XX:NewSize=1024m
* 设置新生代初始内存大小
*
* -XX:MaxNewSize=1024m
* 设置新生代最大内存大小
*
* -XX:MaxTenuringThreshold=15
* 新生代对象每Minor GC后,存活对象age+1,当存活对象age大于MaxTenuringThreshold进入老年代;
*
* -XX:+PrintTenuringDistribution
* JVM每次Minor GC后,打印出当前使用的Survivor中对象年龄分布
*
* 2、Eden与Survivor
* -XX:SurvivorRatio=3
* 设置新生代中 Eden与Survivor 的比例(默认值8)
*
* -XX:+UseAdaptiveSizePolicy
* 自动调整Eden与Survivor比例;
* 默认开启(推荐默认开启)
*
* 3、新生代与老年代
* -XX:NewRatio=4
* 设置 新生代与老年代 比例(默认值2)
*
*
* 3、方法区
* 永久代
* -XX:PermSize=10m
* 初始内存大小
*
* -XX:MaxPermSize=10m
* 最大内存大小
*
* 元空间
* -XX:MetaspaceSize
* 初始元空间大小
*
* -XX:MaxMetaspaceSize
* 最大元空间大小
*
* -XX:+UseCompressedOops
* 压缩对象指针
*
* -XX:+UseCompressedClassPointers
* 压缩类指针
*
* -XX:CompressedClassSpaceSize
* 设置Klass Metaspace大小,默认1G;
*
* <OOM相关>
* -XX:+HeapDumpOnOutOfMemoryError
* 出现OOM的时候,生成heap dump文件(默认当前工程根路径)
*
* -XX:+HeapDumpBeforeFullGC
* 出现Full GC前,生成heap dump文件(默认当前工程根路径)
*
* -XX:HeapDumpPath=<path>
* 指定heap dump转存路径
*
* -XX:OnOutOfMemoryError
* 指定一个 可执行程序或脚本 路径,在发生OOM时,执行该脚本;
*
* <垃圾回收器相关>
* -XX:+PrintCommandLineFlags 或 jinfo -flag 垃圾回收器参数 进程ID
* 查看默认使用的垃圾回收器
*
* <Serial回收器>
* -XX:+UseSerialGC
* 指定新生代使用Serial GC、老年代使用Serial Old GC;
*
* <ParNew回收器>
* -XX:+UseParNewGC
* 新生代使用 ParNew GC;
*
* -XX:ParallelGCThreads=n
* 限制ParNew GC的并行线程数,默认与CPU数相同;
*
* <Parallel回收器>
*
* ***高吞吐量
* ***服务端
*
* -XX:+UseParallelGC
* 新生代使用Parallel GC;
* JDK8默认开启,开启一个,另一个也会被开启
*
* -XX:+UseParallelOldGC
* 老年代使用Parallel Old GC;
* JDK8默认开启,开启一个,另一个也会被开启
*
* -XX:ParallelGCThreads=n
* 新生代并行线程数;
* 默认情况下,当CPU数<8,ParallelGCThreads等于CPU数;
* 当CPU数>8,ParallelGCThreads = 3+[5*CPU_Count/8]
*
* -XX:MaxGCPauseMillis=
* 垃圾回收器 最大停顿时间(STW时间,单位ms)
* ***慎用
*
* -XX:GCTimeRatio=
* 垃圾回收时间 与 总时间的 比例(用于衡量吞吐量大小)
* 默认值99,范围(0,100)
*
* -XX:+UseAdaptiveSizePolicy
* 开启自适应模式,年轻代大小、Eden和Survivor比例、晋升老年代的对象年龄等参数会自动调整,已达到 在堆大小、吞吐量、停顿时间之间的平衡点;
* 手动调优困难的场合,可以使用自适应;
*
* <CMS回收器>
*
* -XX:+UseConcMarkSweepGC
* 老年代使用 CMS GC;
* 开启后,将自动开启-XX:+UseParNewGC,即新生代(ParNew)+老年代(CMS 或 Serial Old GC)
*
* -XX:CMSInitiatingOccupanyFraction
* 堆内存使用率阈值,一旦达到该阈值,开始回收;
* JDK5及之前的版本,默认值为68,当老年代使用率达到68%,进行CMS回收;
* JDK6及以上,默认值为92%;
*
* -XX:+UseCMSCompactAtFullCollection
* CMS执行Full GC后进行内存压缩整理
*
* -XX:CMSFullGCBeforeCompaction=
* CMS执行多少次Full GC后进行内存压缩整理
*
* -XX:ParallelCMSThreads=
* CMS的线程数;
* CMS默认启动的线程数 (ParallelCMSThreads+3)/4;
* ParallelCMSThreads:新生代并行回收器的线程数;
*
* <G1 回收器>
*
* -XX:+UseG1GC
* 使用G1 GC
*
* -XX:G1HeapRegionSize=
* 设置region大小
* 值是2的幂、范围是1~32MB、目标是根据最小的堆大小划分出约2048个区域、默认是堆的1/2000
*
* -XX:MaxGCPauseMillis=
* 设置期望达到的最大GC停顿时间指标
* JVM尽力实现,不保证达到;
* 默认是200ms;
*
* -XX:ParallelThread=
* 设置GC工作线程数的值
* 最多设置为8
*
* -XX:ConcGCThread=
* 设置并发标记线程数
* 设置为ParallelThread的1/4左右;
*
* -XX:InitiatingHeapOccupancyPercent=
* 设置触发并发GC周期的Java堆占用率阈值,超过此值,触发GC;
* 默认45;
*
* <GC日志相关>
*
* -verbose:gc
* 输出GC日志(独立使用)
* 默认输出到标准输出
*
* -XX:+PrintGC
* 等同于 -verbose:gc,表示打开简化的GC日志;(独立使用)
*
* -XX:+PrintGCDetails
* 发生垃圾回收时打印内存回收详情的日志,并在进程退出时输出当前内存各区域分配情况;(独立使用)
*
* -XX:+PrintGCTimeStamps
* 输出GC的时间戳(基准时间)(不能独立使用,需要与之前3个其中之一配合)
*
* -XX:+PrintGCDateStamps
* 输出GC的时间戳(日期时间)(不能独立使用,需要与之前3个其中之一配合)
*
* -XX:+PrintHeapAtGC
* 在进行GC前后打印出堆的信息
*
* -Xloggc:xxx.log
* GC日志文件输出路径
*
* <其他>
* -XX:+DisableExplicitGC
* 禁止Hotspot执行System.gc();
* 默认禁用;
*
* -XX:ReversedCodeCacheSize=<n>[g/m/k] 、-XX:InitialCodeCacheSize=<n>[g/m/k]
* 指定代码缓存大小
*
* -XX:+UseCodeCacheFlushing
* 让JVM放弃一些被编译的代码,避免代码缓存被占满时JVM切到interpreted-only;
*
* -XX:+DoEscapeAnalysis
* 开启逃逸分析
*
* -XX:+UseBiasedLocking
* 开启偏向锁
*
* -XX:+UseLargePages
* 开启使用大页面
*
* -XX:+UseTLAB
* 开启TLAB
* 默认开启
*
* -XX:+PrintTLAB
* 打印TLAB的使用情况
*
* -XX:TLABSize=
* 设置TLAB大小
*/
Java代码获取JVM参数
/**
* <JVM参数-Java代码获取JVM参数>
* 1、java.lang.Runtime
* Runtime runtime = Runtime.getRuntime();
*
* long initMemory = runtime.totalMemory() / 1024 / 1024;
* long maxMemory = runtime.maxMemory() / 1024 / 1024;
* System.out.println("-Xms: "+initMemory + "mb");
* System.out.println("-Xmx: "+maxMemory + "mb");
*
* long systemMemorySize = initMemory * 64 / 1024; // 初始内存大小:物理内存大小 / 64
* System.out.println("系统内存大小: "+ systemMemorySize + "g");
*
* long systemMemorySize1 = maxMemory * 4 / 1024; // 初始内存大小:物理内存大小 / 64
* System.out.println("系统内存大小: "+ systemMemorySize1 + "g");
*
* /**
* * -Xms: 245mb
* * -Xmx: 3641mb
* * 系统内存大小: 15g
* * 系统内存大小: 14g
*
* 2、java.lang.management包
*
* Java提供了java.lang.management包,用于监视和管理JVM和运行时的其他组件,允许 本地和远程 监控和管理 运行的JVM;
*
* MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
* MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
*
* long initHeapSize = heapMemoryUsage.getInit() / 1024 / 1024;
* long maxHeapSize = heapMemoryUsage.getMax() / 1024 / 1024;
* long usedHeapSize = heapMemoryUsage.getUsed() / 1024 / 1024;
* System.out.println("initHeapSize: "+initHeapSize + "m");
* System.out.println("maxHeapSize: "+maxHeapSize + "m");
* System.out.println("usedHeapSize: "+usedHeapSize + "m");
*
* MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();
* System.out.println("heapMemoryUsage:"+ heapMemoryUsage);
* System.out.println("nonHeapMemoryUsage:"+ nonHeapMemoryUsage);
*
* /**
* * initHeapSize: 256m
* * maxHeapSize: 3641m
* * usedHeapSize: 3m
* * heapMemoryUsage:init = 268435456(262144K) used = 4031104(3936K) committed = 257425408(251392K) max = 3817865216(3728384K)
* * nonHeapMemoryUsage:init = 2555904(2496K) used = 4872488(4758K) committed = 8060928(7872K) max = -1(-1K)
*
*/
浙公网安备 33010602011771号