JVM 参数说明(持续更新)

Stella981
• 阅读 852

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收集器的老年代版本, 同样是单线程收集器,使用“标记-整理”算法。

JVM 参数说明(持续更新)

2.Parallel Old收集器

Parallel Old是Parallel Scavenge收老年代版本, 使用多线程和“标记-整理”算法, 吞吐量优先, 主要与Parallel Scavenge配合在 注重吞吐量 及 CPU资源敏感 系统内使用。

JVM 参数说明(持续更新)

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 参数说明(持续更新)

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 

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
秋招面试我去了拼多多,直接被问JVM&GC底层原理和算法,我吊打面试官
(https://shimo.im/docs/9GTP6XrJg9J88cJD/)JVM常用参数设置积累c堆的初始值,默认物理内存的1/64Xms:堆的最大值,默认物理内存的1/4Xmx:年轻代大小「在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8」X
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
JVM 参数学习
一、JVM1、JVM产生GC的位置Eden(新生代)MinorGC算法(复制)Oldtenure(老年代) Major(Full)GC(整理压缩)算法2、JVM堆(Heap)内存大小参数\Xmn新生代8:1:1比例\Xms设置初始化堆内存大小 \Xmx设置堆内存最大大小 产生java.lang.
Stella981 Stella981
3年前
JVM优化之
XmnXmsXmxXss有什么区别Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。\Xms堆内存的最小大小,默认为物理内存的1/64\Xmx堆内存的最大大小,默认为物理内存的1/4\Xmn堆内新生代的大小。通过这个值也可以得到老
Stella981 Stella981
3年前
JVM常用命令参数
(1)Xms20M表示设置JVM启动内存的最小值为20M,必须以M为单位  m:memory(2)Xmx20M表示设置JVM启动内存的最大值为20M,必须以M为单位。将Xmx和Xms设置为一样可以避免JVM内存自动扩展。(3)verbose:gc表示输出虚拟机中GC的详细情况(4)Xss128k表示可以设置虚拟机栈的大
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了