JVM---JVM参数

 

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC

 

参数选项类型

/**
     *  <JVM参数-参数选项类型>
     *          1、标准参数
     *              特点:
     *                  以 - 开头;
     *                  稳定,后续版本基本不会变化;
     *              参数:
     *                  java 命令可以查看
     *
     *          2、-X参数
     *              特点:
     *                  以 -X 开头
     *                  非标准化参数;
     *                  功能还算稳定,后续版本可能会变更;
     *              参数:
     *                  java -X命令可以查看
     *                  eg:
     *                      -Xms<size> 等价于-XX:InitialHeapSize
     *                      -Xmx<size> 等价于-XX:MaxHeapSize
     *                      -Xss<size> 等价于-XX:ThreadStackSize
     *                      -Xloggc:<file>
     *                      -Xmixed
     *                      -Xint
     *
     *          3、-XX参数
     *              特点:
     *                  以 -X 开头
     *                  非标准化参数;
     *                  实验性参数,不稳定;
     *                  使用最多;
     *
     *              作用:
     *                  开发、调试JVM;
     *
     *              分类:
     *                  Boolean类型:
     *                      -XX:+<option> 开启、-XX:-<option> 关闭
     *                          eg: -XX:+PrintFlagsFinal
     *                              输出所有参数名和值
     *
     *                  k-v类型:
     *                      a, 数值类型
     *                          -XX:<option>=<number>
     *                              number可以带单位:
     *                                  兆(m, M)、kb(k, K)、g(g, G)
     *                      b, 非数值类型
     *                          -XX:<option>=<string>
     *                              eg:-XX:HeapDumpPath=/usr/local/...
     */

  

添加JVM参数

/**
     *  <JVM参数-添加JVM参数>
     *
     *      <jar包运行>
     *          java [JVM参数] -jar xxx.jar
     *
     *      <war包在Tomcat运行>
     *          linux:
     *              在tomcat/bin/catalina.sh中添加配置,JAVA_OPTS="-Xms10m -Xmx20m..."
     *
     *          windows:
     *              在catalina.bat中添加配置,set "JAVA_OPTS=-Xms10m -Xmx20m..."
     *
     *     <程序运行过程中>
     *          非boolean类型:
     *              jinfo -flag <name>=<value> 进程ID
     *
     *          boolean类型:
     *              jinfo -flag [+/-]<name> 进程ID
     *
     *          ***注意:并非所有的参数在运行时都允许被修改
     *              查看标记为可以运行时修改的参数:
     *                  java -XX:+PrintFlagsFinal -version | grep manageable
     *
     *                      intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
     *                      intx CMSTriggerInterval                        = -1                                  {manageable}
     *                      intx CMSWaitDuration                           = 2000                                {manageable}
     *                      bool HeapDumpAfterFullGC                       = false                               {manageable}
     *                      bool HeapDumpBeforeFullGC                      = false                               {manageable}
     *                      bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
     *                      ccstr HeapDumpPath                              =                                     {manageable}
     *                      uintx MaxHeapFreeRatio                          = 100                                 {manageable}
     *                      uintx MinHeapFreeRatio                          = 0                                   {manageable}
     *                      bool PrintClassHistogram                       = false                               {manageable}
     *                      bool PrintClassHistogramAfterFullGC            = false                               {manageable}
     *                      bool PrintClassHistogramBeforeFullGC           = false                               {manageable}
     *                      bool PrintConcurrentLocks                      = false                               {manageable}
     *                      bool PrintGC                                   = false                               {manageable}
     *                      bool PrintGCDateStamps                         = false                               {manageable}
     *                      bool PrintGCDetails                            = false                               {manageable}
     *                      bool PrintGCID                                 = false                               {manageable}
     *                      bool PrintGCTimeStamps                         = false                               {manageable}
     */

 

 

常用JVM参数

/**
     *  <JVM参数-常用JVM参数>
     *      <打印设置的参数值>
     *          -XX:+PrintFlagsInitial
     *              打印所有参数的默认值
     *
     *          -XX:+PrintCommandLineFlags
     *              在程序运行前,打印出用户设置或JVM自动设置的参数值;
     *
     *          -XX:+PrintFlagsFinal
     *              打印参数在运行时生效的值;
     *
     *          -XX:+PrintVMOptions
     *              打印JVM参数
     *
     *          jps + jinfo
     *              查看指定参数的值(jinfo -flag JVM参数 进程ID)
     *
     *      <堆-栈-方法区参数>
     *          1、栈
     *              -Xss10k
     *                  设置每个栈内存大小(等价于 -XX:ThreadStackSize=10k)
     *
     *          2、堆
     *              <整堆大小>
     *                  -Xms10k
     *                      设置堆初始内存大小(等价于 -XX:InitialHeapSize=10k)
     *
     *                  -Xmx10k
     *                      设置堆最大内存大小(等价于 -XX:MaxHeapSize=10k)
     *
     *              <新生代>
     *                  1、整新生代
     *                      -Xmn10m
     *                          设置新生代内存大小(等价于 -XX:NewSize=10m + -XX:MaxNewSize=10m)
     *                          官方推荐:新生代为整堆的3/8;
     *
     *                      -XX:NewSize=1024m
     *                          设置新生代初始内存大小
     *
     *                      -XX:MaxNewSize=1024m
     *                          设置新生代最大内存大小
     *
     *                      -XX:MaxTenuringThreshold=15
     *                          新生代对象每Minor GC后,存活对象age+1,当存活对象age大于MaxTenuringThreshold进入老年代;
     *
     *                      -XX:+PrintTenuringDistribution
     *                          JVM每次Minor GC后,打印出当前使用的Survivor中对象年龄分布
     *
     *                  2、Eden与Survivor
     *                      -XX:SurvivorRatio=3
     *                          设置新生代中 Eden与Survivor 的比例(默认值8)
     *
     *                      -XX:+UseAdaptiveSizePolicy
     *                          自动调整Eden与Survivor比例;
     *                          默认开启(推荐默认开启)
     *
     *                  3、新生代与老年代
     *                      -XX:NewRatio=4
     *                          设置 新生代与老年代 比例(默认值2)
     *
     *
     *          3、方法区
     *                  永久代
     *                      -XX:PermSize=10m
     *                          初始内存大小
     *
     *                      -XX:MaxPermSize=10m
     *                          最大内存大小
     *
     *                  元空间
     *                      -XX:MetaspaceSize
     *                          初始元空间大小
     *
     *                      -XX:MaxMetaspaceSize
     *                          最大元空间大小
     *
     *                      -XX:+UseCompressedOops
     *                          压缩对象指针
     *
     *                      -XX:+UseCompressedClassPointers
     *                          压缩类指针
     *
     *                      -XX:CompressedClassSpaceSize
     *                          设置Klass Metaspace大小,默认1G;
     *
     *      <OOM相关>
     *          -XX:+HeapDumpOnOutOfMemoryError
     *              出现OOM的时候,生成heap dump文件(默认当前工程根路径)
     *
     *          -XX:+HeapDumpBeforeFullGC
     *              出现Full GC前,生成heap dump文件(默认当前工程根路径)
     *
     *          -XX:HeapDumpPath=<path>
     *              指定heap dump转存路径
     *
     *          -XX:OnOutOfMemoryError
     *              指定一个 可执行程序或脚本 路径,在发生OOM时,执行该脚本;
     *
     *      <垃圾回收器相关>
     *          -XX:+PrintCommandLineFlags 或 jinfo -flag 垃圾回收器参数 进程ID
     *              查看默认使用的垃圾回收器
     *
     *          <Serial回收器>
     *              -XX:+UseSerialGC
     *                  指定新生代使用Serial GC、老年代使用Serial Old GC;
     *
     *          <ParNew回收器>
     *              -XX:+UseParNewGC
     *                  新生代使用 ParNew GC;
     *
     *              -XX:ParallelGCThreads=n
     *                  限制ParNew GC的并行线程数,默认与CPU数相同;
     *
     *          <Parallel回收器>
     *
     *              ***高吞吐量
     *              ***服务端
     *
     *              -XX:+UseParallelGC
     *                  新生代使用Parallel GC;
     *                  JDK8默认开启,开启一个,另一个也会被开启
     *
     *              -XX:+UseParallelOldGC
     *                  老年代使用Parallel Old GC;
     *                  JDK8默认开启,开启一个,另一个也会被开启
     *
     *              -XX:ParallelGCThreads=n
     *                  新生代并行线程数;
     *                  默认情况下,当CPU数<8,ParallelGCThreads等于CPU数;
     *                  当CPU数>8,ParallelGCThreads = 3+[5*CPU_Count/8]
     *
     *              -XX:MaxGCPauseMillis=
     *                  垃圾回收器 最大停顿时间(STW时间,单位ms)
     *                  ***慎用
     *
     *              -XX:GCTimeRatio=
     *                 垃圾回收时间 与 总时间的 比例(用于衡量吞吐量大小)
     *                 默认值99,范围(0,100)
     *
     *             -XX:+UseAdaptiveSizePolicy
     *                 开启自适应模式,年轻代大小、Eden和Survivor比例、晋升老年代的对象年龄等参数会自动调整,已达到 在堆大小、吞吐量、停顿时间之间的平衡点;
     *                 手动调优困难的场合,可以使用自适应;
     *
     *          <CMS回收器>
     *
     *              -XX:+UseConcMarkSweepGC
     *                  老年代使用 CMS GC;
     *                  开启后,将自动开启-XX:+UseParNewGC,即新生代(ParNew)+老年代(CMS 或 Serial Old GC)
     *
     *              -XX:CMSInitiatingOccupanyFraction
     *                  堆内存使用率阈值,一旦达到该阈值,开始回收;
     *                  JDK5及之前的版本,默认值为68,当老年代使用率达到68%,进行CMS回收;
     *                  JDK6及以上,默认值为92%;
     *
     *              -XX:+UseCMSCompactAtFullCollection
     *                  CMS执行Full GC后进行内存压缩整理
     *
     *              -XX:CMSFullGCBeforeCompaction=
     *                  CMS执行多少次Full GC后进行内存压缩整理
     *
     *              -XX:ParallelCMSThreads=
     *                  CMS的线程数;
     *                  CMS默认启动的线程数 (ParallelCMSThreads+3)/4;
     *                      ParallelCMSThreads:新生代并行回收器的线程数;
     *
     *          <G1 回收器>
     *
     *              -XX:+UseG1GC
     *                  使用G1 GC
     *
     *              -XX:G1HeapRegionSize=
     *                  设置region大小
     *                  值是2的幂、范围是1~32MB、目标是根据最小的堆大小划分出约2048个区域、默认是堆的1/2000
     *
     *              -XX:MaxGCPauseMillis=
     *                  设置期望达到的最大GC停顿时间指标
     *                  JVM尽力实现,不保证达到;
     *                  默认是200ms;
     *
     *              -XX:ParallelThread=
     *                  设置GC工作线程数的值
     *                  最多设置为8
     *
     *              -XX:ConcGCThread=
     *                  设置并发标记线程数
     *                  设置为ParallelThread的1/4左右;
     *
     *              -XX:InitiatingHeapOccupancyPercent=
     *                  设置触发并发GC周期的Java堆占用率阈值,超过此值,触发GC;
     *                  默认45;
     *
     *      <GC日志相关>
     *
     *          -verbose:gc
     *              输出GC日志(独立使用)
     *              默认输出到标准输出
     *
     *          -XX:+PrintGC
     *              等同于 -verbose:gc,表示打开简化的GC日志;(独立使用)
     *
     *          -XX:+PrintGCDetails
     *              发生垃圾回收时打印内存回收详情的日志,并在进程退出时输出当前内存各区域分配情况;(独立使用)
     *
     *          -XX:+PrintGCTimeStamps
     *              输出GC的时间戳(基准时间)(不能独立使用,需要与之前3个其中之一配合)
     *
     *          -XX:+PrintGCDateStamps
     *              输出GC的时间戳(日期时间)(不能独立使用,需要与之前3个其中之一配合)
     *
     *          -XX:+PrintHeapAtGC
     *              在进行GC前后打印出堆的信息
     *
     *          -Xloggc:xxx.log
     *              GC日志文件输出路径
     *
     *      <其他>
     *          -XX:+DisableExplicitGC
     *              禁止Hotspot执行System.gc();
     *              默认禁用;
     *
     *          -XX:ReversedCodeCacheSize=<n>[g/m/k] 、-XX:InitialCodeCacheSize=<n>[g/m/k]
     *              指定代码缓存大小
     *
     *          -XX:+UseCodeCacheFlushing
     *              让JVM放弃一些被编译的代码,避免代码缓存被占满时JVM切到interpreted-only;
     *
     *          -XX:+DoEscapeAnalysis
     *              开启逃逸分析
     *
     *          -XX:+UseBiasedLocking
     *              开启偏向锁
     *
     *          -XX:+UseLargePages
     *              开启使用大页面
     *
     *          -XX:+UseTLAB
     *              开启TLAB
     *              默认开启
     *
     *          -XX:+PrintTLAB
     *              打印TLAB的使用情况
     *
     *          -XX:TLABSize=
     *              设置TLAB大小
     */

  

Java代码获取JVM参数

/**
     *  <JVM参数-Java代码获取JVM参数>
     *      1、java.lang.Runtime
     *         Runtime runtime = Runtime.getRuntime();
     *
     *         long initMemory = runtime.totalMemory() / 1024 / 1024;
     *         long maxMemory = runtime.maxMemory() / 1024 / 1024;
     *         System.out.println("-Xms: "+initMemory + "mb");
     *         System.out.println("-Xmx: "+maxMemory + "mb");
     *
     *         long systemMemorySize = initMemory * 64 / 1024; // 初始内存大小:物理内存大小 / 64
     *         System.out.println("系统内存大小: "+ systemMemorySize + "g");
     *
     *         long systemMemorySize1 = maxMemory * 4 / 1024; // 初始内存大小:物理内存大小 / 64
     *         System.out.println("系统内存大小: "+ systemMemorySize1 + "g");
     *
     *         /**
     *          * -Xms: 245mb
     *          * -Xmx: 3641mb
     *          * 系统内存大小: 15g
     *          * 系统内存大小: 14g
     *
     *      2、java.lang.management包
     *
     *         Java提供了java.lang.management包,用于监视和管理JVM和运行时的其他组件,允许 本地和远程 监控和管理 运行的JVM;
     *
     *         MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
     *         MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
     *
     *         long initHeapSize = heapMemoryUsage.getInit() / 1024 / 1024;
     *         long maxHeapSize = heapMemoryUsage.getMax() / 1024 / 1024;
     *         long usedHeapSize = heapMemoryUsage.getUsed() / 1024 / 1024;
     *         System.out.println("initHeapSize: "+initHeapSize + "m");
     *         System.out.println("maxHeapSize: "+maxHeapSize + "m");
     *         System.out.println("usedHeapSize: "+usedHeapSize + "m");
     *
     *         MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();
     *         System.out.println("heapMemoryUsage:"+ heapMemoryUsage);
     *         System.out.println("nonHeapMemoryUsage:"+ nonHeapMemoryUsage);
     *
     *         /**
     *          * initHeapSize: 256m
     *          * maxHeapSize: 3641m
     *          * usedHeapSize: 3m
     *          * heapMemoryUsage:init = 268435456(262144K) used = 4031104(3936K) committed = 257425408(251392K) max = 3817865216(3728384K)
     *          * nonHeapMemoryUsage:init = 2555904(2496K) used = 4872488(4758K) committed = 8060928(7872K) max = -1(-1K)
     *
     */

  

posted on 2022-05-18 16:48  anpeiyong  阅读(44)  评论(0编辑  收藏  举报

导航