• JVM 参数及调优


    更多内容,前往 IT-BLOG-CN

    一、JVM 启动参数规则

    【1】以-开头的都是标准参数,所有JVM都支持,并且向后兼容。

    -version:gc
    -server
    
    • 1
    • 2

    【2】以-X开头的为非标准参数,绝大多数都是控制JVM的参数。在不同版本的jvm中,参数可能会有所不同,并不保证所有jvm实现都满足,且不保证向后兼容。可以通过java -X查看非标准参数。

    -Xmx2G  
    -Xms2G 
    -Xloggc:/data/kinyang/log/gc.%t.log
    
    • 1
    • 2
    • 3

    【3】以-XX:开头的为非稳定参数,专门用于控制JVM行为。主要用于JVM的调优和debug操作。将来可能会随时取消,需要慎重使用。

    -XX:+UseParNewGC  
    -XX:CompileThreshold=10  	
    -XX:HeapDumpPath=/data/kinyang/dump/heap/
    
    • 1
    • 2
    • 3

    -XX:+启用option,例如:-XX:+PrintGCDetails启动打印GC信息的选项,其中+号表示true,开启的意思
    -XX:-不启用option,例如:-XX:-PrintGCDetails关闭启动打印GC信息的选项,其中-号表示false,关闭的意思
    -XX:=设定option的值为数字类型,可跟单位,例如32k, 1024m,2g。例如:-XX:MaxPermSize=64m
    -XX:=设定option的值为字符串,例如:-XX:HeapDumpPath="/data/kinyang/dump/heap/"

    【4】以-D开头的是系统参数赋值(可以是系统默认有的参数,也可以是自己定义的参数),在程序中可以通过System.getProperty(key)获取和通过System.setProperty(key, value)进行设置

    -Dfile.encoding=UTF-8 
    -Dlog.path=/data/kinyang/test/log/
    
    • 1
    • 2

    二、X参数

    参数含义默认值示例说明
    -Xms初始堆大小物理内存的1/64(<1GB)-Xms7372m
    -Xmx最大堆大小物理内存的1/4(<1GB)-Xmx12288m尽量设置的跟-Xms一样,防止因为内存不断增加后突然收缩带来的性能影响
    -Xmn新生代大小-Xmn256M这个参数影响性能,尽量设置小一点
    -Xss指定线程栈的大小-Xss256k一般来说,WEBX框架下的应用需要256k
    -Xloggcgc日志文件路径-Xloggc:/usr/local/gc_%t_%p.log将gc信息打印到指定的文件中,通过时间戳生成文件名

    三、XX参数

    参数含义示例说明
    -XX:MetaspaceSize设置元空间大小-XX:MetaspaceSize=128m永久代被元空间取代,同时元空间不像永久代一样受制于堆内存。
    元空间是基于操作系统内存的,理论上讲,可以一直扩展内存直到操作系统的极限,所以设置元空间大小时,建议加上-XX:MaxMetaspaceSize参数,给个范围限制,和-XX:MetaspaceSize参数值一样。
    一般设置成256M即可,避免元空间占用的内存一直增长。
    -XX:MaxMetaspaceSize设置元空间最大大小-XX:MaxMetaspaceSize=256m
    -XX:MaxGCPauseMillisGC最大的停顿毫秒数-XX:MaxGCPauseMillis=200默认情况下,VM没有暂停时间目标值。参数应谨慎使用,太小的值将会导致更高频率的GC
    -XX:+UseG1GC使用G1收集器
    -XX:-OmitStackTraceInFastThrow关闭“省略异常栈信息从而快速抛出”默认打开必须关闭,否则会导致异常信息打印不全。
    例如:只有java.lang.NullPointerException信息,没有完整的具体信息,展示什么地方为空的堆栈信息。
    -XX:MinHeapFreeRatioJVM堆最小空闲比率-XX:MinHeapFreeRatio=30默认值40,当堆空间的空闲内存小于这个数值时,jvm便会扩展堆空间
    -XX:MaxHeapFreeRatio设置堆空间的最大空间比例-XX:MaxHeapFreeRatio=50默认值80,当堆空间的空闲内存大于这个数值时,jvm便会缩小堆空间
    -XX:CICompilerCount最大并行编译器线程数-XX:CICompilerCount=3
    -XX:ActiveProcessorCount确定可用处理器的数量-XX:ActiveProcessorCount=4覆盖VM用于计算其用于各种操作 (例如GC和ForkJoinPool) 的线程池大小的CPU数量
    在docker容器中运行多个Java进程时, 此标志对于分区CPU资源很有用
    -XX:+PreserveFramePointer精准的获取栈结构火焰图相关,会导致一定的性能损耗
    -XX:+PrintGC垃圾回收时信息打印与-verbose:gc功能一致
    -verbose:gc 是稳定版本的参数;-XX:+PrintGC,由于是 -XX 开头可能在未来版本删除非稳定
    -XX:+PrintGCDetails输出详细的GC收集日志的信息
    -XX:+PrintGCDateStamps输出GC的时间戳以日期的形式,如 2013-05-04T21:53:59.234+0800
    -XX:+UseGCLogFileRotation实现 GC 日志轮转-XX:+UseGCLogFileRotation当日志文件大小增加到 32MB,JVM 会进行 GC 日志轮转生成最多5个文件,扩展名分别为 gc.log.0、gc.log.1、gc.log.2、gc.log.3和 gc.log.4。
    如果应用不断产生更多的 GC 日志,gc.log.0中的旧日志内容会被删除,新产生的 GC 事件将写入 gc.log.0。
    这意味着日志内容完整性早到破坏,即无法看到所有 GC 事件。
    -XX:NumberOfGCLogFiles日志文件轮转的文件个数-XX:NumberOfGCLogFiles=5
    -XX:GCLogFileSize日志文件的最大存储量-XX:GCLogFileSize=32M
    -XX:+HeapDumpOnOutOfMemoryError堆内存空间溢出时输出堆的内存快照-XX:HeapDumpPath=目录时,参数表示生成DUMP文件的路径。默认为:java__heapDump.hprof。
    -XX:HeapDumpPath=文件时,形如-XX:HeapDumpPath=d:\java_heapdump.hprof。
    -XX:HeapDumpPath=/opt/logs/xxxDump目录或文件
    -XX:ConcGCThreads=4并发GC的线程数默认值取决于JVM可用的CPU数量
    ConcGCThreads=ParallelGCThreads/4四舍五入
    -XX:ParallelGCThreads=4指定并行 GC 线程的数量一般最好和 CPU 核心数量相当
    当 CPU 数量小于8, ParallelGCThreads 的值等于 CPU 数量;
    当 CPU 数量大于 8 时,则使用公式:ParallelGCThreads = 8 + ((N - 8) * 5/8) = 3 +((5*CPU)/ 8)
    -XX:NewSize设置年轻代最小空间大小
    -XX:MaxNewSize设置年轻代最大空间大小
    -XX:NewRatio设置年轻代和老年代的比值默认值-XX:NewRatio=2,表示年轻代与老年代比值为1:2,年轻代占整个堆大小的1/3
    -XX:SurvivorRatio设置年轻代中Eden区Survivor区的容量比值默认值-XX:SurvivorRatio=8,表示Eden : Survivor0 : Survivor1 = 8 : 1 : 1
    XX:MaxTenuringThreshold新生代中对象存活次数-XX:MaxTenuringThreshold=18经过Minor GC的次数后仍然存活,就会晋升到老年代

    四、其他参数

    参数含义说明
    -Djava.util.concurrent.ForkJoinPool.common.parallelism=4ForkJoinPool通用线程池的线程数量默认值是运行时计算机的处理器数量
    -Dport.http.server=8080服务端口
    -Dlog.server=/opt/logs/xx服务日志路径
    -Dport.shutdown.server=8081
    -Ddocbase.server=/opt/app
    -Dvdir.server=/myproject
    -Djava.security.egd=file:/dev/./urandom
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
    -Djava.rmi.server.hostname=192.168.11.171
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=8780
    -Dcom.sun.management.jmxremote.rmi.port=8780
    -Dcom.sun.management.jmxremote.local.only=false
    -DAPPLOGDIR=/opt/logs/100198389/applog
    -Djava.util.concurrent.ForkJoinPool.common.threadFactory=com.ctrip.forkjoinworkerthreadfactory.CtripForkJoinWorkerThreadFactory
    -Dcatalina.base=/opt/tomcat
    -Dcatalina.home=/opt/tomcat
    -Djava.io.tmpdir=/opt/tomcat/temp
    -Dignore.endorsed.dirs=-Djava.endorsed.dirs指定的目录面放置的jar文件,将有覆盖系统API的功能
    -Djdk.tls.ephemeralDHKeySize=2048DH密钥大小从1024位增加到2048位一种安全协议,一种确保共享KEY安全穿越不安全网络的方法
  • 相关阅读:
    基于SSM的校园学生管理系统的设计与实现
    [减脂期食谱] 自制千岛酱
    B+树索引页大小是如何确定的?
    分子相互作用的人工智能
    JavaEE进阶 - Spring Boot 日志文件 - 细节狂魔
    1016 Phone Bills(25)
    美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?
    python接口自动化测试(六)-unittest-单个用例管理
    这4款浏览器必装插件,让浏览器使用体验上升100%
    北亚数据恢复-WINDOWS还原系统后分区数量和大小不一致的数据恢复方案
  • 原文地址:https://blog.csdn.net/zhengzhaoyang122/article/details/127943201