网站首页 > 技术文章 正文
作者:qbit snap
链接:https://segmentfault.com/a/1190000022603726
前言
- JVM 的参数有好几百个,听着有点吓人,好在最常用的参数只有两个,其他绝大多数参数都无需调整。可以参考廖雪峰的文章: JVM调优的正确姿势
-Xms8g
-Xmx8g
- Oracle 对 JVM 参数的说明文档(https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html)
Client/Server
- JVM 有两种运行模式 Server 与 Client。
- Client 模式启动速度较快,Server 模式启动较慢。
- 启动进入稳定期长期运行之后 Server 模式的程序运行速度比 Client 要快很多。
- 查看当前虚拟机处于哪种模式
λ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
- 64 位 JDK 无法切换到 Clinet 模式
打印 JVM 参数
- 打印 JVM 参数初始值
λ java -XX:+PrintFlagsInitial
- 打印 JVM 参数最终值
λ java -XX:+PrintFlagsFinal 2> nul
- 打印被修改过的 JVM 参数
# 输出经由人工换行
λ java -XX:+PrintCommandLineFlags 2> nul
-XX:InitialHeapSize=266579392
-XX:MaxHeapSize=4265270272
-XX:+PrintCommandLineFlags
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC
jvm 内存模型
- 图片来源于网络
常用参数
-Xms: 初始堆大小
-Xmx: 最大堆大小
-XX:NewSize: 年轻代初始化内存的大小(注意:该值需要小于-Xms的值)
-XX:MaxnewSize: 年轻代可被分配的内存的最大上限(注意:该值需要小于-Xmx的值)
从 JKD1.4 开始,MaxnewSize 是通过 NewRatio 计算出来的
-Xmn: 对-XX:newSize、-XX:MaxnewSize两个参数同时进行配置(JDK1.4之后才有该参数)
官方推荐为对大小的 3/8,即 1/4 到 1/3 之间
-XX:NewRatio: 设置老年代和年轻代的比值
若 -Xmn 已指定,则 OldSize = HeapSize - NewSize,无需再按比例计算。
例如 NewRatio 为 3,表示 老年代/年轻代 = 3,年轻代占整个堆内存大小的 1/4
- 对于年轻代的堆内存大小,默认情况下是通过 NewRatio(2) 计算出来的,即占用 1/3;在配置 Xmn 后,会覆盖默认的通过 NewRatio 计算出来的年轻代堆大小值
# 摘录的部分的输出行
# MaxHeapSize/MaxNewSize = 4265607168/1421869056 = 3
λ java -XX:+PrintFlagsFinal
uintx NewRatio = 2 {product}
uintx MaxNewSize := 1421869056 {product}
uintx MaxHeapSize := 4265607168 {product}
- 一般 -Xms、-Xmx 两个参数会配置相同的值(优点:能够在Java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源)。
CompressedOops
压缩普通对象指针
compressed ordinary object pointers,压缩普通对象指针
(0, 2GB] Compressed Oops mode: 32-bit
[2GB, 26GB] Compressed Oops mode: Zero based,26G不是确切值,视系统而定
(26GB, 32GB) Compressed Oops mode: Non-zero disjoint base,32G不是确切值,视系统而定
[32GB, ) CompressedOops 失效,32G不是确切值,视系统而定
检查 CompressedOops 阈值
- 下面测试的粒度为 GB,也可以到 MB
# CompressedOops 阈值
# 32 G,false 表示超过了阈值
$ ./jdk/bin/java -Xmx32g -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
bool UseCompressedOops = false {lp64_product}
# 31G,true 表示在阈值之内
$ ./jdk/bin/java -Xmx31g -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
bool UseCompressedOops := true {lp64_product}
# zero based Compressed Oops 阈值
# 31G,Non-zero
./jdk/bin/java -server -Xms31G -Xmx31G -XX:+UnlockDiagnosticVMOptions -Xlog:gc+heap+coops=info -version
[0.134s][info][gc,heap,coops] Heap address: 0x0000001000800000, size: 31744 MB, Compressed Oops mode: Non-zero disjoint base: 0x0000001000000000, Oop shift amount: 3
openjdk 13.0.2 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.2+8)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.2+8, mixed mode, sharing)
# 30G,Zero based
./jdk/bin/java -server -Xms30G -Xmx30G -XX:+UnlockDiagnosticVMOptions -Xlog:gc+heap+coops=info -version
[0.128s][info][gc,heap,coops] Heap address: 0x0000000080000000, size: 30720 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.1+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.1+9, mixed mode, sharing)
测试案例
- Why 35GB Heap is Less Than 32GB – Java JVM Memory Oddities
这个案例中,分配 32g 比 31g 能创建的对象少了 50%
587889429/385481085 ≈ 1.525
- Going over Xmx32G heap boundary means you will have less memory available
这个案例中,48g 才基本达到 31g 的效果
本文出自
猜你喜欢
- 2025-08-26 升级JDK17的理由,核心是降低GC时间
- 2024-11-04 Dockerfile 命令详解 dockerfile常用命令
- 2024-11-04 运维日记|那些年你可能会踩的坑—xtts篇
- 2024-11-04 oracle数据库访问控制配置(白名单)
- 2024-11-04 深入浅出!十三张图带你从源码了解SpringBoot启动流程!实战篇
- 2024-11-04 linux操作命令随笔 linux系统的操作命令
- 2024-11-04 Jenkins安装配置,项目发布、管理详解,史上最清晰,值得收藏!
- 2024-11-04 0034 使用table表格标签进行网页排版
- 2024-11-04 Java课程设计报告+源码-万年历的设计与实现
- 2024-11-04 Java 8之后的那些新特性(二):文本块 Text Blocks
你 发表评论:
欢迎- 最近发表
-
- 用AI做微信小程序的完整步骤_如何用ai制作微信表情包
- 自习室预约的微信小程序设计与实现-计算机毕业设计源码+LW文档
- 微信小程序开发入门指南_微信小程序开发入门教程
- 写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体
- 白描网页版 - 高效准确且免费的OCR文字识别工具
- 字体图形面板与图标字体使用_字体图标的优势和劣势
- 作为前端工程师必须懂得的33个CSS核心概念
- Flutter程序员开发炫酷的登录页面 字体库运用 路由学习 源码分享
- 2025Q3开源字体盘点:让你的代码和文档'颜值'飙升!
- Agent杂谈:Agent的能力上下限及「Agent构建」核心技术栈调研分享~
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)