当前位置:网站首页>JVM学习----垃圾回收调优
JVM学习----垃圾回收调优
2022-08-02 11:46:00 【北海怪兽Monster】
首先需要掌握GC相关的VM参数,会基本的空间调整
在java 安装目录下:查看相关的GC参数
调优跟应用,环境有关。并没有实际准则。
调优领域
- 内存
- 锁竞争
- cpu占用
- io
确定目标
- 低延迟(互联网项目) 还是 高吞吐量(科学计算项目),选择合适的回收器。
- CMS , G1 , ZGC(java 12)
- ParallelGC
最快的GC 是不发生GC
- 查看FullGC 前后的内存占用(查看是不是自己代码问题)
- 数据是不是太多?
- 数据是否臃肿,存在非必须数据
- 对象大小问题,最小的object要占16字节
- 代码中,是否存在内存泄露?
新生代调优
新生代的特点:
所有的new操作的内存分配非常廉价,TLAB thread-local allocation buffer 用于存放线程信息,让每个线程用自己私有的这块Eden内存区域进行对象内存分配。这样不会对线程之后产生干扰。
死亡对象的回收代价是0
大部分对象用过即死
MinorGC 的时间远远低于 Full GC
如何调优:
-Xmn // 设置新生代大小 , 官方推荐: 新生代占 堆总大小的 25%~50%
- 并不是越大越好,太小的话会频繁的Minor GC。要是太大 , 老年代空间必然减少,新生代的垃圾回收触发少了,但是到一定时间之后,老年代会频繁触发垃圾回收(Full GC 时间 > MinorGC时间)。
- 新生代空间大小,和吞吐量的关系,有一个平衡值,当超过某个值时,吞吐量会跟随空间大小增加而下降。
- 新生代采用的标记复制算法,对于新生代来说,很多对象都是 朝生夕死,将幸存对象拷贝到幸存区。新生代的大小并不会影响到拷贝速度。
- 新生代大小,一般来说。 新生代大小 = 【并发量 * (一次请求响应过程中产生的对象)】的数据
- 幸存区大小,幸存区大小 = 能够保留 当前活跃对象(Eden区中可能晋升的对象,这些活跃对象都有可能进入幸存区) + 需要晋升的对象(在幸存区中没有达到晋升条件的对象)
新生代幸存区调优:
晋升阈值配置得当,让长时间存活对象尽快晋升。
-XX:MaxTenuringThreshold=threshold // 设置晋升阈值
-XX:+PrintTenuringDistribution // 查看各个 年龄段对象占的空间大小
老年代调优
以CMS为例:
- CMS的老年代内存越大越好
- 先尝试不做调优,如果没有Full GC那么可以不用调优老年代,先尝试调试新生代。
- 观察发生Full GC时老年代内存占用,将老年代内存预设调大 1/4 ~ 1/3
- -XX:CMSInitiatingOccupancyFraction=percent // 75% ~80%
边栏推荐
猜你喜欢
随机推荐
当POC遇见RPA:RPA项目顺利实施的关键
Multithreading (Basic) - 40,000 word summary
sva 断言资料
免费文档翻译-免费批量文档翻译软件推荐
CCF paper conference IEEE how to query all articles of a conference journal
QAbstractScrollArea、QScrollArea
您应该知道的 Google Sheets 使用技巧
划分训练集,验证集,测试集
大疆P4M云遮挡矫正
Shell编程案例
8大软件供应链攻击事件概述
ASP.NET Core 6框架揭秘实例演示[31]:路由“高阶”用法
openresty 性能优化
C#为listview选中的项添加右键菜单
智能手表前景如何?
Mysql transaction isolation level and MVCC (multi-version concurrency control)
Golang map数组按字段分类
面积曲线AUC(area under curve)
Likou 58 - Left Rotation String
故障分析 | 一条 SELECT 语句跑崩了 MySQL ,怎么回事?