Java虚拟机之JVM启动参数大全

说明

本文所有的参数是基于JDK7的HotSpot虚拟机,适用于JDK7及以前版本,JDK7后续版本参数是否有效请自测。

对于启用或关闭功能选项:-XX:+<option>打开某功能;-XX:-<option>关闭某功能;

对于数字型选项:-XX:<option>=<number>,若需要表示大小,可在数字后添加k、m、g;

对于字符串选项:-XX:<option>=<string>,用于指定文件,路径或命令列表;

参数列表

功能选项

参数与默认值 描述
-XX:-AllowUserSignalHandlers 允许使用用户自定义的信号处理器 (只对应Solaris和Linux)
-XX:AltStackSize=16384 修改栈容量 (单位 Kb) (对应Solaris, JDK 5.0以后弃用)
-XX:-DisableExplicitGC 禁止手动调用System.gc()
-XX:+FailOverToOldVerifier 如果新的类型校验器验证失败使用旧版本的类型校验器 (开始于JDK6.)
-XX:+HandlePromotionFailure 关闭新生代收集担保(java5以前是默认不启用,java6默认启用)
-XX:+MaxFDLimit 将文件描述符加到最大 (对应Solaris)
-XX:PreBlockSpin=10 控制多线程自旋锁优化的自旋次数
-XX:-RelaxAccessControlCheck 放宽类型校验机的准入控制(JDK6)
-XX:+ScavengeBeforeFullGC 在full GC之前先做年轻代GC (开始于JDK1.4.1.)
-XX:+UseAltSigs 为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代 SIGUSR1和SIGUSR2(限于Solaris)
-XX:+UseBoundThreads 绑定所有的用户线程到内核线程, 减少线程进入饥饿状态(得不到任何cpu time)的次数(限于Solaris)
-XX:-UseConcMarkSweepGC 使用并发的mark-sweep GC收集年老代 (始于JDK1.4.1)
-XX:+UseGCOverheadLimit 使用一种限制VM做GC操作的时间所占比例过高的策略 (始于JDK6.)
-XX:+UseLWPSynchronization 使用轻量级进程同步替代线程同步 (始于JDK1.4.0. Solaris相关)
-XX:-UseParallelGC 使用并发平行GC(始于JDK1.4.1)
-XX:-UseParallelOldGC 使用并发平行GC做 full GC. (始于JDK5.0 update 6.)
-XX:-UseSerialGC 使用串行GC (始于JDK5.0.)
-XX:-UseSpinning 启用多线程自旋锁优化(java1.4.2和1.5需要手动启用)
-XX:+UseTLAB 启用线程本地缓存区(1.4.2以前和使用-client选项时,默认不启用,其余版本默认启用)
-XX:+UseSplitVerifier 使用新的Class类型校验器(java5默认不启用, java6默认启用)
-XX:+UseThreadPriorities 使用本地线程的优先级
-XX:+UseVMInterruptibleIO 在solaris中,允许运行时中断线程(限于solaris)

G1垃圾收集器选项

参数与默认值 描述
-XX:+UseG1GC 使用G1垃圾处理器
-XX:MaxGCPauseMillis=n 设置并行收集最大暂停时间,这是一个理想目标,JVM将尽最大努力来实现它
-XX:InitiatingHeapOccupancyPercent=n 启动一个并发垃圾收集周期所需要达到的整堆占用比例。这个比例是指整个堆的占用比例而不是某一个代(例如G1),如果这个值是0则代表‘持续做GC’。默认值是45
-XX:NewRatio=n 设置年轻代和年老代的比值。例如:值为3,则表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxTenuringThreshold=n 设置垃圾最大存活阀值。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论
-XX:ParallelGCThreads=n 配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等
-XX:ConcGCThreads=n 并发垃圾收集器线程数
-XX:G1ReservePercent=n 设置保留用来做假天花板以减少晋升(新生代对象晋升到老生代)失败可能性的堆数目
-XX:G1HeapRegionSize=n 使用G1垃圾回收器,java堆被划分成统一大小的区块。这个选项设置每个区块的大小。最小值是1Mb,最大值是32Mb

性能选项

参数与默认值 描述
-XX:+AggressiveOpts 启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等(JDK 5 update 6后引入,但需要手动启用, JDK6默认启用)
-XX:CompileThreshold=10000 通过JIT编译器,将方法编译成机器码的触发阀值,可以理解为调用方法的次数,例如调1000次,将方法编译为机器码
-XX:LargePageSizeInBytes=4m 设置堆内存的内存页大小
-XX:MaxHeapFreeRatio=70 GC后,如果发现空闲堆内存占到整个预估上限值的70%,则收缩预估上限值
-XX:MaxNewSize=size 新生代占整个堆内存的最大值
-XX:MaxPermSize=64m Perm(俗称方法区)占整个堆内存的最大值
-XX:MinHeapFreeRatio=40 GC后,如果发现空闲堆内存占到整个预估上限值的40%,则增大上限值
-XX:NewRatio=2 新生代和年老代的堆内存占用比例, 例如2表示新生代占年老代的1/2,占整个堆内存的1/3
-XX:NewSize=2m 新生代预估上限的默认值
-XX:ReservedCodeCacheSize=32m 设置代码缓存的最大值,编译时用
-XX:SurvivorRatio=8 Eden与Survivor的占用比例
-XX:TargetSurvivorRatio=50 实际使用的survivor空间大小占比。默认是50%,最高90%
-XX:ThreadStackSize=512 线程堆栈大小
-XX:+UseBiasedLocking 启用偏向锁
-XX:+UseFastAccessorMethods 优化原始类型的getter方法性能(get/set:Primitive Type)
-XX:-UseISM 启用solaris的ISM
-XX:+UseLargePages 启用大内存分页
-XX:+UseMPSS 启用solaris的MPSS,不能与ISM同时使用
-XX:+UseStringCache 启用缓存常用的字符串
-XX:AllocatePrefetchLines=1 在使用JIT生成的预读取指令分配对象后读取的缓存行数。如果上次分配的对象是一个实例则默认值是1,如果是一个数组则是3
-XX:AllocatePrefetchStyle=1 预读取指令的生成代码风格0- 无预读取指令生成 1-在每次分配后执行预读取命令 2-当预读取指令执行后使用TLAB()分配水印指针来找回入口
-XX:+UseCompressedStrings 其中,对于不需要16位字符的字符串,可以使用byte[] 而非char[]。对于许多应用,这可以节省内存,但速度较慢(5%-10%)
-XX:+OptimizeStringConcat 优化字符串连接操作在可能的情况下

调试选项

参数与默认值 描述
-XX:-CITime 打印发费在JIT编译上的时间
-XX:ErrorFile=./hs_err_pid<pid>.log 错误文件
-XX:-ExtendedDTraceProbes 启用性能的影响DTrace探测器
-XX:HeapDumpPath=./java_pid<pid>.hprof 指定HeapDump的文件路径或目录
-XX:-HeapDumpOnOutOfMemoryError 当抛出OOM时进行HeapDump
-XX:OnError="<cmd args>;<cmd args>" 当发生错误时执行用户指定的命令
-XX:OnOutOfMemoryError="<cmd args>; <cmd args>" 当发生OOM时执行用户指定的命令
-XX:-PrintClassHistogram 当Ctrl+Break发生时打印Class实例信息,与jmap -histo相同
-XX:-PrintConcurrentLocks 当Ctrl+Break发生时打印java.util.concurrent的锁信息, 与jstack -l相同
-XX:-PrintCommandLineFlags 打印命令行上的标记
-XX:-PrintCompilation 当方法被编译时打印信息
-XX:-PrintGC 当GC发生时打印信息
-XX:-PrintGCDetails 打印GC详细信息
-XX:-PrintGCTimeStamps 打印GC用时
-XX:-PrintTenuringDistribution 打印Tenuring年龄信息
-XX:-PrintAdaptiveSizePolicy 打印自适应调整
-XX:-TraceClassLoading 跟踪类加载
-XX:-TraceClassLoadingPreorder 跟踪所有加载的引用类
-XX:-TraceClassResolution 跟踪常量池的变化
-XX:-TraceClassUnloading 跟踪类的卸载
-XX:-TraceLoaderConstraints 打印class的装载策略变化信息到stdout。
-XX:+PerfDataSaveToFile 退出时保存jvmstat二进制文件
-XX:ParallelGCThreads=n 设置新生代与老年代并行垃圾回收器的线程数
-XX:+UseCompressedOops 使用compressed pointers。这个参数默认在64bit的环境下默认启动,但是如果JVM的内存达到32G后,这个参数就会默认为不启动,因为32G内存后,压缩就没有多大必要了,要管理那么大的内存指针也需要很大的宽度了
-XX:+AlwaysPreTouch 在JVM 初始化时预先对Java堆进行摸底
-XX:AllocatePrefetchDistance=n 为对象分配设置预取距离
-XX:InlineSmallCode=n 当编译的代码小于指定的值时,内联编译的代码
-XX:MaxInlineSize=35 内联方法的最大字节数
-XX:FreqInlineSize=n 内联频繁执行的方法的最大字节码大小
-XX:LoopUnrollLimit=n 代表节点数目小于给定值时打开循环体
-XX:InitialTenuringThreshold=7 设置初始的对象在新生代中最大存活次数
-XX:MaxTenuringThreshold=n 设置对象在新生代中最大的存活次数,最大值15,并行回收机制默认为15,CMS默认为4
-Xloggc:<filename> 输出GC详细日志信息至指定文件
-XX:-UseGCLogFileRotation 开启GC日志文件切分功能,前置选项 -Xloggc
-XX:NumberOfGClogFiles=1 设置切分GC日志文件数量,文件命名格式:.0, .1, ..., .n-1
-XX:GCLogFileSize=8K GC日志文件切分大小

参考文献

HotSpot官方文档

原文地址:https://www.cnblogs.com/Sirius-/p/13929106.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下:[root@admin ~]# jinfo --helpUsage: jinfo [option] &lt;pid&gt; (to connect to running process) jinfo [option] &lt;executable &lt;core&gt; (to connect to a core file) jinfo [option] [serve
原文链接:https://www.cnblogs.com/niejunlei/p/5987611.htmlJava Virtual Machine Stacks,线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型:每一个方法执行的同时都会创建一个栈帧(Stack Frame),由于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法的执行就对应着栈帧在虚拟机栈中的入栈,出栈...
java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是由类加载器一步步解析, 执行与生成与内存区域中的; 并且jvm有自己的垃圾回收器对内存区域管理, 回收; 但是我们已经可以通过一些工具来在程序运行时查看对应的jvm内存使用情况, 帮助更好的分析与优化我们的代码;jps查看系统中有哪些java进程jps 命令类似与 linux 的 ps 命令,但是它只列出系统中所有的 Java 应用程序。 通过 jps 命令可以方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息
1.jvm的简单抽象模型:  2.类加载机制     双亲委派模型是为了防止jdk核心类库被篡改,如果需要打破可以重写Classloader.loadClass方法。r 双亲委派模型:一个类加载器收到一个类的加载请求,他会先判断自身是否已存在该类,如果不存在上抛给上一级类加载器ClassLoad
堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代码中还可以使用堆外内存,比如Netty,广泛使用了堆外内存,但是这部分的内存并不归JVM管理,GC算法并不会对它们进行回收,所以在使用堆外内存时,要格外小心,防止内存一直得不到释放,造成线上故障。堆外内存的申请和释放JDK的ByteBuffe
1.springboot和tomcat2.springcloud的请求如何通过网关鉴权?3.springmvc启动时组件的加载顺序?4.mybatis如何同时更新三条记录5.hibernate实现级联更新6.一个web程序应用程序启动时的加载流程7.如何向www.baidu.com地址发出请求时,并获取相应?8.???9.谈谈你对tcp/iptelnetudp协
堆设置-Xms256M:初始堆大小256M,默认为物理内存的1/64-Xmx1024M:最大堆大小1024M,默认为物理内存的1/4,等于与-XX:MaxHeapSize=64M-Xmn64M:年轻代大小为64M(JDK1.4后支持),相当于同时设置NewSize和MaxNewSize为64M-XX:NewSize=64M:初始年轻代大小-XX:MaxNewSize=256M:最大年轻代大小(默认
一.概述收集算法(JVM之垃圾回收-垃圾收集算法)是内存回收的抽象策略,垃圾收集器就是内存回收的具体实现。JVM规范对于垃圾收集器的应该如何实现没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器差别较大,这里只看HotSpot虚拟机。就像没有最好的算法一样,垃圾收集器
Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象,如下图所示: 在Java中,堆被划分成两个不同的区域:新生代(Young)、老年代(Old)。新生代(Young)又被划分为三个区域:Eden、S0、S1。 这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包
JVM深入理解JVM(4)——如何优化JavaGC「译」 PostedbyCrowonAugust21,2017本文翻译自SangminLee发表在Cubrid上的”BecomeaJavaGCExpert”系列文章的第三篇《HowtoTuneJavaGarbageCollection》,本文的作者是韩国人,写在JDK1.8发布之前,虽然有些地
 JVM深入理解JVM(2)——GC算法与内存分配策略 PostedbyCrowonAugust10,2017说起垃圾收集(GarbageCollection,GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Scala等)程序员在提升开
运行时数据区  线程独有本地方法栈、虚拟机栈、程序计数器这些与线程对应的数据区会随着线程开始和结束创建和销毁  整体公有元数据区(又称方法区)、堆区会随着虚拟机启动而创建,随着虚拟机退出而销毁 
java整个堆大小设置:Xmx和Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍。永久代PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍年轻代Xmx的设置为老年代存活对象的1-1.5倍老年代的内存大小设置为老年代存活对象的2-3倍BTW: Sun官方建议年轻代
栈顶缓存(Top-of-StackCashing)技术基于栈式架构得虚拟机所使用的零地址指令更加紧凑,但完成一项操作的时候必然使用更多的入栈和出栈指令,这同时也就意味着将需要更多的指令分派次数和内存读写次数 由于操作数是存储在内存重的,因此频繁地执行内存读/写操作必然影响速度。 综上
自用。同样的代码在不同的平台生成的机器码是不一样的,为什么java代码生成的字节码文件,能在不同的平台运行?因为不同版本的jdk里面的虚拟机会屏蔽不同操作系统在底层硬件与指令上的区别。栈:线程栈,局部变量存放栈内存区域。线程(分配一个栈)运行分配栈将局部变量放入内存。怎么放:栈
jconsole监控:1.java启动命令加上参数java-Djava.rmi.server.hostname=172.16.17.247-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=2099-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false -XX:+Unlock
类加载器分类publicclassStackStruTest{publicstaticvoidmain(String[]args){//对用户自定义个类来说:默认使用系统类加载器进行加载-----AppClassLoaderClassLoaderclassLoader=StackStruTest.class.getClassLoader();System.out.p
堆体系结构一个JVM实例只存在一个堆内存,堆内存的大小是可调节的。类加载器读取类文件后,需要把类、方法、常量、变量放在堆内存中,保存所有引用类型的真实信息,以方便执行器指向,堆内存分为三个部分:年轻代、老年代、永久代。Java7之前,堆内存在逻辑上分为:年轻代、老年代、永久代。物
JVM深入理解JVM(5)——虚拟机类加载机制 PostedbyCrowonAugust21,2017在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机中会发生什么变化?本文将逐步解答这
保存(持久化)对象及其状态到内存或者磁盘Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在