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) * */