读Java性能权威指南(第2版)笔记16_垃圾回收C
1.Java性能权威指南(第2版)读后总结与感想2.读Java性能权威指南(第2版)笔记01_导言3.读Java性能权威指南(第2版)笔记02_ Java SE API技巧上4.读Java性能权威指南(第2版)笔记03_ Java SE API技巧中5.读Java性能权威指南(第2版)笔记04_ Java SE API技巧下6.读Java性能权威指南(第2版)笔记05_数据库性能JDBC7.读Java性能权威指南(第2版)笔记06_数据库性能JPA&SpringData8.读Java性能权威指南(第2版)笔记07_即时编译器上9.读Java性能权威指南(第2版)笔记08_即时编译器中10.读Java性能权威指南(第2版)笔记09_即时编译器下11.读Java性能权威指南(第2版)笔记10_原生内存12.读Java性能权威指南(第2版)笔记11_堆内存上13.读Java性能权威指南(第2版)笔记12_堆内存中14.读Java性能权威指南(第2版)笔记13_堆内存下15.读Java性能权威指南(第2版)笔记14_垃圾回收A16.读Java性能权威指南(第2版)笔记15_垃圾回收B
17.读Java性能权威指南(第2版)笔记16_垃圾回收C
18.读Java性能权威指南(第2版)笔记17_垃圾回收D19.读Java性能权威指南(第2版)笔记18_垃圾回收E20.读Java性能权威指南(第2版)笔记19_垃圾回收F21.读Java性能权威指南(第2版)笔记20_垃圾回收G22.读Java性能权威指南(第2版)笔记21_垃圾回收H23.读Java性能权威指南(第2版)笔记22_ 操作系统工具和Java监控工具24.读Java性能权威指南(第2版)笔记23_ 性能分析工具25.读Java性能权威指南(第2版)笔记24_ Java飞行记录器JFR26.读Java性能权威指南(第2版)笔记25_性能测试方法上27.读Java性能权威指南(第2版)笔记26_性能测试方法下28.读Java性能权威指南(第2版)笔记27_线程和同步性能上29.读Java性能权威指南(第2版)笔记28_线程和同步性能中30.读Java性能权威指南(第2版)笔记29_线程和同步性能下31.读Java性能权威指南(第2版)笔记30_Java服务器1. 调整堆的大小
1.1. 随着堆的大小增加,停顿的持续时间也会增加
1.2. 停顿发生的频率确实会降低,但是停顿的持续时间会拖慢整体性能
1.3. 操作系统进行的交换对JVM是不公开的
1.3.1. 操作系统要将数据从磁盘交换到RAM,这是一个代价高昂的操作
1.4. 首要规则是设定堆的大小永远不要超过机器的物理内存
1.4.1. 如果有多个JVM在运行,那么这适用于所有堆的总和
1.5. -XmsN标志
1.5.1. 初始值
1.6. -XmxN标志
1.6.1. 最大值
1.7. 默认值
1.7.2. 在物理内存小于192 MB的机器上,堆的最大值会是物理内存的一半(96 MB或更少)
1.8. 如果JVM发现堆在初始大小时,GC的次数太多,它就会不断地增加堆大小,直到JVM执行的GC数量“适当”,或者直到堆大小达到最大值
1.9. 对于不需要堆很大的应用程序来说,根本不需要设置堆的大小,只需要设定GC算法的性能目标
1.10. 除非应用程序需要比默认值更大的堆,否则优化时可以调整GC算法的性能目标而不是微调堆的大小
1.11. 一个有效的经验是,调整堆的大小,让其在Full GC之后,仍然被占用30%
1.11.1. 用jconsole连接应用程序,强制执行Full GC,并观察当Full GC完成后有多少内存被占用
1.11.2. 确保它有额外的0.5 GB~1 GB内存来满足JVM的非堆需求
1.12. 当JVM运行在隔离容器中时,你需要设定堆的最大值
1.13. 确切地知道应用程序需要多大的堆,那么不妨将初始值和最大值都设置为该值
1.13.1. 因为GC不再需要弄清楚是否应该调整堆大小,稍微高效一点
2. 调整分代大小
2.1. 新生代相对较大
2.1.1. Young GC的停顿时间会增加
2.1.2. 新生代的回收频率会降低
2.1.3. 晋升到老年代的对象也会更少
2.1.4. 老年代相对会更小
2.1.4.1. 被填满的频率会更高
2.1.4.2. 会执行更多的Full GC
2.2. 优化分代大小的命令行标志,调整的都是新生代的大小,老年代自动得到剩余的所有空间
2.3. -XX:NewRatio=N
2.3.1. 设置新生代与老年代的比例
2.3.2. 新生代初始大小=堆的初始大小/(1 +NewRatio)
2.3.3. 默认值是2
2.3.3.1. 新生代的初始大小是堆初始大小的33%
2.3.4. 如果应用程序会动态调整堆大小,并且需要更大的(或更小的)新生代,那就重点设置NewRatio的值
2.4. -XX:NewSize=N
2.4.1. 设置新生代的初始值
2.4.2. 设置了该选项,那么它将优先于通过NewRatio计算出来的值
2.4.3. 没有默认值
2.4.3.1. 默认情况下这个值会通过NewRatio计算出来
2.5. -XX:MaxNewSize=N
2.5.1. 设置新生代的最大值
2.5.2. 通过设定新生代的最小值和最大值来进行优化是十分困难的
2.6. -XmnN
2.6.1. 将NewSize和MaxNewSize设置为同一个值的简单写法
2.6.2. 如果堆的大小是固定的(通过设置-Xms等于-Xmx),通常最好也用-Xmn将新生代大小设为固定的
2.7. 自适应大小
2.7.1. 一般应该保持开启
2.7.1.1. 因为GC算法会通过调整代的大小,来尽量满足它们停顿时间的目标
2.7.1.2. 控制着JVM改变堆内新生代和老年代比例的方式
2.7.2. 关闭-XX:-UseAdaptiveSizePolicy标志
2.7.2.1. 默认值为true
2.7.3. 如果堆的最小值和最大值设置为相同的值,并且新生代的初始值和最大值也设为相同的值,那么自适应大小实际上就被关闭了
2.7.4. 如果你想将其中某个阶段的GC优化到最佳状态,禁用自适应大小很有用
2.7.5. 对于精细优化过的堆,禁用自适应大小能小幅提升性能
2.7.6. 开启-XX:+PrintAdaptiveSizePolicy标志
2.7.6.1. 查看JVM是如何调整应用程序内空间大小
2.7.6.2. 执行GC时,GC日志里会包含回收过程中各个代是如何调整大小的详细信息
合集:
读Java性能权威指南(第2版)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库