【JVM性能调优】- 合理分配堆空间

1、合理的堆空间该如何分配

Java内存各分区的大小对JVM的性能影响很大,不恰当的空间大小可能会埋下很多故障隐患,同时也会直接或间接影响JVM的提升速率、分配速率,所以如何将各分区调整到合适的大小就成了一个棘手的问题。大部分不具备线上JVM调优实操经验的开发者都会茫然,通常会认为设定的越大越好,但答案却并非如此。

在指定各区域大小时,可以依据"活跃数据"大小来进行设定,"活跃数据"是指应用程序稳定运行后长期存活在堆中的对象,也就是FullGC后年老代中的对象。一般在计算"活跃数据大小",都会多次采集程序稳定执行后的FullGC日志,通过取平均值的方式计算出堆中长期存活的年老代总量大小。

计算出"活跃数据大小"后,就可以根据其具体值计算出其他分区恰当的值,比例如下:

  • ①堆空间:活跃数据大小的4~5倍
  • ②新生代:活跃数据大小的1.5~2倍
  • ③年老代:活跃数据大小的2.5~3倍
  • ④元空间:活跃数据大小的1.2~1.8倍

假设此时观测出的"活跃数据大小"为800MB,那堆空间的各区域的大小:

  • ①堆空间:3200MB
  • ②新生代:1200MB
  • ③年老代:2000MB

当然,这仅作为初始值参考,具体情况取决于应用业务的特性和需求。

但需注意的是:实际过程中,-Xmx、-Xms两个参数设定的值必须一致,这样做的好处在于可以避免动态伸缩时带来的性能损耗与空间震荡,因为当JVM内存不足向OS申请内存时都会触发一次全局GC。

相关推荐
On The Road :12 小时前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
Yves..14 小时前
JVM 学习笔记:内存区域、类加载机制与垃圾回收
jvm
akinggw1 天前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
yh弓长1 天前
JVM 核心机制
jvm
tg_xianheyun2 天前
腾讯云国际账号注册代充值适合哪些海外业务场景?
jvm
yuniko-n2 天前
【JVM】对象内存布局
java·开发语言·jvm
wuminyu2 天前
JVM执行引擎学习总结:热点字节码编译成本地机器码
java·linux·c语言·jvm·c++
wuminyu3 天前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
骑着蜗牛撵大象3273 天前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
tryxr3 天前
JVM 垃圾回收机制
java·jvm·gc·垃圾回收