JVM---JVM参数
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC
参数选项类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | /** * <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参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | /** * <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参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | /** * <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参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | /** * <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) * */ |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)