JVM 常用参数说明
参数名称
默认值
描述
-Xms
-Xms,JVM启动时申请的最小Heap内存大小,默认为物理内存的 1/64 但小于 1G;
-Xmx
-Xmx,JVM启动时申请的最大Heap内存大小, 默认为物理内存的 1/4 但小于 1G
-Xmn
指定新生代内存大小
-XX:SurvivorRatio
新生代 S0、S1 与 E 区的占用比例关系;HotSpot默认Eden和Survivor的大小比例为8∶1
-Xss
设置每个线程的堆栈大小
-XX:+UseG1GC
开启G1 垃圾收集机制
-XX:+AlwaysPreTouch
false
在调用main函数之前,使用所有可用的内存分页。这个选项可以用来测试长时间运行的系统,所有的内存都已被分配。默认这个选项是关闭的,也就是不会使用所有的内存分页。
-XX:+AggressiveHeap
false
java堆最佳化设置。设置多个参数使长时间运行过的任务使用密集的内存分配。 默认这个选项时关闭的,也就是堆不是最佳化。
-XX:+PrintCompilation
false
打印类编译信息
-XX:+UnlockDiagnosticVMOptions
解锁 diagnostic 虚拟机参数
-XX:+ParallelRefProcEnabled
并行处理Reference,加快处理速度,缩短耗时
-XX:ParallelGCThreads
参数控制GC线程数
-XX:PreBlockSpin
10
自旋锁的自旋次数配置;JDK1.6+是自动开启的。
-XX:+TraceClassUnloading
跟踪卸载类信息
-XX:+TraceClassLoading
跟踪装载类信息
-XX:ParGCCardsPerStrideChunk
256
控制GC工作线程的任务粒度,可以帮助不使用补丁而获得最佳性能,这个补丁用来优化新生代垃圾回收的卡表扫描时间; 每个线程处理的CardTable数量,默认是256个。每个线程每次处理大小为 256*512byte = 128K的StrideChunk,如果old gen大小4G,那么一共要处理 4G / 128K = 32K个StrideChunk
-XX:+BindGCTaskThreadsToCPUs
绑定GC线程到个别的CPU核
-XX:+UseGCTaskAffinity
使用affinity参数将任务分配给GC工作线程
-XX:+UseStringDeduplication
字符串去重
-XX:StringDeduplicationAgeThreshole
3
默认值3,字符串的最小存活年龄
-XX:+PrintStringDeduplicationStatistics
启用打印字符串去重统计(观察控制台)
XX:+TieredCompilation
开启JDK7的多层编译
-XX:CMSExpAvgFactor=percent
25
指定垃圾收集消耗的时间百分比。默认这个数是25%
-XX:PretenureSizeThreshold
大于该值的大对象直接在老年代分配,避免在Eden区和Survivor区之间产生大量的内存复制(大对象一般指 需要大量连续内存的Java对象, 如很长的字符串和数组)
-XX:MaxTenuringThreshold
15
对象在Eden出生如果经第一次Minor GC后仍然存活, 且能被Survivor容纳的话, 将被移动到Survivor空间中, 并将年龄设为1. 以后对象在Survivor区中每熬过一次Minor GC年龄就+1. 当增加到一定程度,将会晋升到老年代。也可以称作:年龄阀值
控制对象在经过多少次minor GC之后进入老年代,此参数只有在Serial 串行GC时有效
-XX:+PrintEliminateAllocations
查看标量替换情况
-XX:+EliminateAllocations
开启标量替换
-XX:+EliminateLocks
开启同步消除
-XX:+PrintClassHistogramBeforeFullGC
-XX:+PrintClassHistogramAfterFullGC
-XX:MaxDirectMemorySize
最大直接内存
-XX:MinHeapFreeRatio
40%
默认值为40%
-XX:MaxHeapFreeRatio
70%
默认为70%,当JVM空闲堆的大小大于70%时,JVM会减少Heap的大小到 -Xms 指定的大小
-Xnoclassgc
-XX:+PrintFlagsInitial
JVM 默认初始化参数
-XX:+PrintFlagsFinal
关闭CLASS的垃圾回收功能。在大量使用动态代理、CGLib等字节码框架的应用中一定要关闭该选项,开启VM的类卸载功能, 以保证方法区不会溢出
-XX:TLABWasteTargetPercent
来设置TLAB可占用的Eden Space
-XX:+PrintTLAB
查看TLAB空间的使用情况
-XX:+PrintCommandLineFlags
-XX:+ExplicitGCInvokesConcurrent
命令JVM无论什么时候调用系统GC,都执行CMS GC,而不是Full GC。
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
保证当有系统GC调用时,永久代也被包括进CMS垃圾回收的范围内。因此,通过使用这些标志,我们可以防止出现意料之外的”stop-the-world”的系统GC。
-XX:+HeapDumpBeforeFullGC
垃圾收集器—— 新生代
1.Serial收集器
Serial收集器是Hotspot运行在Client模式下的默认新生代收集器, 它的特点是 只用一个CPU/一条收集线程去完成GC工作,且在进行垃圾收集时必须暂停其他所有的工作线程(”Stop The World“ -后面简称STW)。
2.ParNew收集器
ParNew收集器其实是前面Serial的多线程版本, 除使用多条线程进行GC外,包括Serial可用的所有控制参数、收集算法、STW、对象分配规则、回收策略等都与Serial完全一样。
-XX: +UseConcMarkSweepGC
JVM默认新生代收集器
3. Parallel Scavenge收集器
与ParNew类似, Parallel Scavenge也是使用复制算法, 也是并行多线程收集器. 但与其他收集器关注尽可能缩短垃圾收集时间不同, Parallel Scavenge更关注系统吞吐量。
MaxGCPauseMillis
毫秒数,收集器会尽量的保证垃圾回收耗时不超过设定的这个阀值,但是如果太小的话,会导致GC的频率增加。
GCTimeRatio
垃圾收集时间占总时间的比率,取值范围为:0 < GCTimeRatio < 100。
-XX:+UserAdaptiveSizePolicy
启用GC自适应的调节策略:不再需要指定 -Xmn、-XX:SurvivorRatio、-XX:PretenureSizeThreshold等细节参数,JVM会根据当前系统运行情况手机性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量。
垃圾收集器—— 老年代
1.Serial Old 收集器
Serial Old是Serial收集器的老年代版本, 同样是单线程收集器,使用“标记-整理”算法。
2.Parallel Old收集器
Parallel Old是Parallel Scavenge收老年代版本, 使用多线程和“标记-整理”算法, 吞吐量优先, 主要与Parallel Scavenge配合在 注重吞吐量 及 CPU资源敏感 系统内使用。
3.CMS收集器 *
CMS是一种以获取最短回收停顿时间为目标的收集器(CMS又称多并发低暂停的收集器), 基于”标记-清除”算法实现, 整个GC过程分为以下4个步骤:
(1). 初始标记(CMS initial mark) —— (STW)
(2). 并发标记(CMS concurrent mark: GC Roots Tracing过程)
(3). 重新标记(CMS remark) —— (STW)
(4). 并发清除(CMS concurrent sweep: 已死象将会就地释放, 注意: 此处没有压缩)
初始标记仅只标记一下GC Roots能直接关联到的对象, 速度很快; 而重新标记则是为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录, 虽然一般比初始标记阶段稍长, 但要远小于并发标记时间.
-XX:+UseCMSInitiatingOccupancyOnly
启用触发百分比
-XX:CMSInitiatingOccupancyFraction
GC触发阀值
-XX:+UseCMSCompactAtFullCollection
CMS 执行完 FullGC 后,会产生内存碎片,过多会导致无法分配大对象,而提前触发Full GC,因为该开关参数用于在执行一次碎片整理。
-XX:CMSFullGCsBeforeCompaction
默认值为 0,每次都要进行碎片整理。在执行N次Full GC 后,不进行内存整理,接着来一次带碎片整理的。
4.分区收集- G1收集器
G1(Garbage-First)是一款面向服务端应用的收集器,主要目标用于配备多颗CPU的服务器治理大内存。
-XX:+UseG1GC
启用G1收集器.
JVM自带工具(图来自网络)
JVM 常用参数(图来自网络)
其他一些备忘录
--conf spark.executor.extraJavaOptions=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
GC参数, 备忘1:
-Xmx2048M -XX:MaxDirectMemorySize=1024M -XX:+PrintGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC -XX:+HeapDumpOnOutOfMemoryError
GC参数, 备忘2:
-XX:ConcGCThreads=3 -XX:+FlightRecorder -XX:G1HeapRegionSize=4194304 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/bruntime/logs -XX:InitialHeapSize=8589934592 -XX:MaxGCPauseMillis=100 -XX:MaxHeapSize=8589934592 -XX:+ParallelRefProcEnabled -XX:+PrintClassHistogram -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UnlockCommercialFeatures -XX:+UseCompressed
GC参数, 备忘3:
CommandLine flags: -XX:InitialHeapSize=8589934592 -XX:MaxHeapSize=8589934592 -XX:MaxNewSize=2863312896 -XX:MaxTenuringThreshold=6 -XX:NewSize=2863312896 -XX:OldPLABSize=16 -XX:OldSize=5726621696 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:ThreadStackSize=256 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
查看直接内存占用大小
java -classpath .:${JAVA_HOME}/lib/sd-jdi.jar DirectMemorySize