JVM学习-JVM运行时参数

JVM参数选项
标准参数选项
  • 特点

    • 稳定,后续版本不会变化
    • 以【-】开头
  • 各种选项

    • 运行java或者java -help可以看到所有的标准选项
  • 补充内容

    • -server:64位机器上只支持Server模式的JVM,适用于需要大内存的应用程序,默认用并行垃圾回收器
    • -client:在32位Windows系统上,默认使用Client类型的JVM,要想使用Server模式,则机器配置至少有2个以上的CPU和2G以上的物理内存。Client模式适用于对内存要求较小的桌面应用程序,默认使用Serial串行垃圾回收器
-X参数选项
  • 特点

    • 非标准化参数
    • 功能相对稳定,官方说后续可能会变更
    • 以-X开头
  • 各种选项

    • 运行java -X命令可以查看所有的X选项
  • JVM的JIT编译模式相关的选项

    • -Xint:禁用JIT,所有字节码都被解释执行,这个模式的速度最慢
    • -Xcomp:所有字节码第一次使用就都被编译成本地代码,然后再执行
    • -Xmixed:混合模式,默认模式,让JIT根据程序的运行情况,有选择地将某些代码
  • 特别

    • -Xms:设置初始Java堆大小,等价于-XX:InitialHeapSize
    • -Xmx:设置最大堆大小,等价于-XX:MaxHeapSize
    • -Xss:设置Java线程堆栈大小,等价于-XX:ThreadStackSize
-XX参数选项
  • 特点
    • 非标准化参数
    • 使用最多的类型
    • 这类选项属于实验性,不稳定
    • 以-XX开头
  • 作用
    • 用于开发和调试JVM
  • 分类
    • Boolean类型
      • -XX:+表示启用option属性
      • -XX:-表示禁用option属性
      • 举例(-XX:+UseParallelGC启用并行收集器,-XX:+UseG1GC启用G1收集器,-XX:+UseAdaptiveSizePolicy自动选择年轻代区大小和相应的Survivor区比例)
      • 有些指令默认是开启的,可以使用-关闭
    • 非Boolean类型(key-value类型)
      • 子类型1:数值型格式-XX:=
      • 子类型2:非数值型格式-XX:=
      • 举例(-XX:NewSize=1024m设置新生代初始大小为1024M,-XX:MaxGCPauseMillis=500 设置GC停顿时间:500毫秒,-XX:GCTimeRatio=19设置吞吐量,-XX:NewRatio=2设置新生代和老年代比例,-XX:HeapDumpPath=/usr/local/heapdump.hprof指定heap转储文件存储位置)
  • 特别
    • -XX:PrintFlagsFinal
      • 输出所有参数的名称和默认值
      • 默认不包括Dignostic和Experimental参数
      • 可以配合-XX:+UnlockDiagnosticVMOptions和-XX:UnlockExperimentalVMOptions使用
添加JVM参数
Eclipse


IDEA


运行jar包
  • java -Xms500m -Xmx500m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar demo.jar
通过Tomcat运行war包
  • linux系统下,找到tomcat/bin/catalina.sh中添加JAVA_OPTS="-Xms500m -Xmx500m"
  • windows系统下,找到catalina.bat不添加set "JAVA_OPTS=-Xms500m -Xmx500m"
程序运行过程中
  • 使用jinfo -flag=设置非boolean类型参数
  • 使用jinfo -flag[+|-]设置boolean类型参数
  • 可以修改的参数见
常用的JVM参数
打印设置的XX选项及值
  • -XX:+PrintCommandLineFlags:让程序运行前打印出用户手动设置或者JVM自动设置的XX选项
  • -XX:+PrintFlagsInitial:打印出所有XX选项的默认值
  • -XX:+PrintFlagsFinal:打印出XX选项在运行程序时生效的值
  • -XX:+PrintVMOptions:打印JVM参数
堆、栈、方法区等内存大小设置
    • -Xss128k:每个线程的栈大小为128k
  • 堆内存
    • -Xms1024m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为1024m
    • -Xmx1024m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为1024m
    • -Xmn1g:设置年轻代大小为1G,官方建议设置整个堆大小的3/8
    • -XX:NewSize=1024m:设置年轻代初始值为1024m
    • -XX:MaxNewSize=1024m:设置年轻代最大值为1024m
    • -XX:SurvivorRatio=8:设置年轻代中Eden与一个Survivor区的比值,默认8
    • -XX:UseAdaptiveSizePolicy:自动选择各区大小比例
    • -XX:NewRatio=4:设置老年代与年轻代(包括1个Eden和2个Survivor区)比值
    • -XX:PretenureSizeThreadshold=1024:设置让大于此阈值的对象直接分配在老年代,单位为字节,只对Serial和parNew收集器有效
    • -XX:MaxTenuringThrehold=15
      • 新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的值时进入老年代
      • 默认值15
    • -XX:PrintTenuringDistribution:让JVM每次MinorGC后打印当前使用的Survivor中对象的年龄分布
    • -XX:TargetSurvivorRatio:表示MinorGC结束后Survivor区域中占用空间的期望比例
  • 方法区
    • 永久代
      • -XX:PermSize=256m:设置永久代初始值为256m
      • -XX:MaxPermSize=256m:设置永久代最大值为256m
    • 元空间
      • -XX:MetaspaceSize:初始空间大小
      • -XX:MaxMetaspaceSize:最大空间大小,默认没有限制
      • -XX:UseCompressedOops:压缩对象指针
      • -XX:UseCompressedClassPointers:压缩类指针
      • -XX:UseCompressedSpaceSize:设置Klass Metadata的大小,默认1G
  • 直接内存
    • -XX:MaxDirectMemorySize:指定DirectMemory容量,若未指定,则默认与Java堆最大值一样
OutOfMemory相关选项
  • -XX:HeapDumpOnOutOfMemoryError:内存出现OOM的时候,把Heap转存(dump)到文件方便后续分析
  • -XX:HeapDumpBeforeFullGC:出现FullGC之前,生成Heap转储文件
  • -XX:HeapDumpPath= :指定heap转存文件的存储路径
  • -XX:OnOutOfMemoryError:指定一个可行性程序或者脚本的路径,当发生OOM时,去执行这个脚本
垃圾收集器相关选项
  • 查看默认垃圾收集器
    • -XX:+PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)
    • 使用命令行指令:jinfo -flag 相关垃圾收集器参数 进程ID
  • Serial回收器
    • Serial收集器作为Hotspot中Client模式下的默认新生代垃圾收集器,Serial Old是运行在Client模式下默认的老年代垃圾回收器
    • -XX:+UseSerialGC:指定年轻代和老年代都使用串行收集器,等价于新生代使用Serial GC,老年代使用Serial Old GC,可获得最高的单线程收集效率
  • ParNew回收器
    • -XX:+UseParNewGC:手动指定使用ParNew收集器执行内存回收任务,它表示年轻代使用并行收集器,不影响老年代
    • -XX:ParallelGCThreads=N:限制线程数量,默认开启和CPU相同的线程数
  • Parallel回收器
  • CMS回收器
    • JDK9 Deprecate
    • JDK14 Remove
  • G1回收器
  • 如何选择垃圾回收器
GC日志相关选项
其他参数
通过Java代码获取JVM参数

持续更新中... ...

相关推荐
码云数智-大飞几秒前
C++ RAII机制:资源管理的“自动化”哲学
java·服务器·php
2601_949816585 分钟前
Spring+Quartz实现定时任务的配置方法
java
计算机毕设指导61 小时前
基于SpringBoot校园学生健康监测管理系统【源码文末联系】
java·spring boot·后端·spring·tomcat·maven·intellij-idea
mysuking1 小时前
springboot与springcloud对应版本
java·spring boot·spring cloud
希望永不加班1 小时前
SpringBoot 数据库连接池配置(HikariCP)最佳实践
java·数据库·spring boot·后端·spring
迈巴赫车主1 小时前
蓝桥杯3500阶乘求和java
java·开发语言·数据结构·职场和发展·蓝桥杯
倒酒小生2 小时前
今日算法学习小结
学习
身如柳絮随风扬2 小时前
Lambda、方法引用与Stream流完全指南
java·开发语言
yaoyouzhong2 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
醇氧2 小时前
【学习】【说人话版】子网划分
学习