当前位置: 首页 > news >正文

【实战JVM】-实战篇-06-GC调优

文章目录

  • 1 GC调优概述
    • 1.1 调优指标
      • 1.1.1 吞吐量
      • 1.1.2 延迟
      • 1.1.3 内存使用量
  • 2 GC调优方法
    • 2.1 发现问题
      • 2.1.1 jstat工具
      • 2.1.2 visualvm插件
      • 2.1.3 Prometheus+Grafana
      • 2.1.4 GC Viewer
      • 2.1.5 GCeasy
    • 2.2 常见GC模式
      • 2.2.1 正常情况
      • 2.2.2 缓存对象过多
      • 2.2.3 内存泄漏
      • 2.2.4 持续FullGC
      • 2.2.5 元空间不足导致FullGC
    • 2.3 解决GC问题的手段
      • 2.3.1 优化基础JVM参数
        • 2.3.1.1 -Xmx -Xms 堆参数
        • 2.3.1.2 -XX:MaxMetaspaceSize -XX:MetaspaceSize 元空间参数
        • 2.3.1.3 -Xss 虚拟机栈参数
        • 2.3.1.4 不建议设置参数
        • 2.3.1.5 模板
      • 2.3.2 更换垃圾回收器
    • 2.4 实战
      • 2.4.1 总结


1 GC调优概述

在这里插入图片描述

1.1 调优指标

1.1.1 吞吐量

在这里插入图片描述

在这里插入图片描述

1.1.2 延迟

在这里插入图片描述

使用GCeasy来进行分析

1.1.3 内存使用量

在这里插入图片描述

2 GC调优方法

在这里插入图片描述

2.1 发现问题

2.1.1 jstat工具

在这里插入图片描述

jstat -gc 3785 1000 10

在这里插入图片描述

2.1.2 visualvm插件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1.3 Prometheus+Grafana

在这里插入图片描述

2.1.4 GC Viewer

生成GC日志

在这里插入图片描述

-XX:+PrintGCDetails -Xloggc:test1.log

生成

在这里插入图片描述

在这里插入图片描述

java -jar gcviewer-1.36.jar test1.log

在这里插入图片描述

2.1.5 GCeasy

https://gceasy.ycrash.cn/gc-dashboard.jsp

在这里插入图片描述

在这里插入图片描述

给的相当详细

在这里插入图片描述

2.2 常见GC模式

2.2.1 正常情况

在这里插入图片描述

2.2.2 缓存对象过多

在这里插入图片描述

2.2.3 内存泄漏

在这里插入图片描述

2.2.4 持续FullGC

在这里插入图片描述

2.2.5 元空间不足导致FullGC

在这里插入图片描述

2.3 解决GC问题的手段

在这里插入图片描述

2.3.1 优化基础JVM参数

2.3.1.1 -Xmx -Xms 堆参数

在这里插入图片描述

在这里插入图片描述

2.3.1.2 -XX:MaxMetaspaceSize -XX:MetaspaceSize 元空间参数

在这里插入图片描述

所以我们启动程序之后基本都会触发1到2次的由元空间不足引起的FullGC,这是因为-XX:MetaspaceSize触发FullGC最开始的大小可能只有20M,所以会触发1到2次的FullGC,因为是在启动的时候触发的,所以并不会对用户的使用产生影响。

2.3.1.3 -Xss 虚拟机栈参数

在这里插入图片描述

2.3.1.4 不建议设置参数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3.1.5 模板

在这里插入图片描述

2.3.2 更换垃圾回收器

第二点减少对象的产生,就涉及内存调优,这个在以前已经讲过了,不再赘述

在这里插入图片描述

private Cache cache = Caffeine.newBuilder().weakKeys().softValues().build();

软引用+弱引用最大程度保证缓存不会溢出

先测试jdk8自带ps+po

-Xms4g -Xmx4g -Xss256k -XX:MaxMetaspaceSize=512m  -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/test.hprof  -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

启动测试脚本

在这里插入图片描述

50并发下最大的响应时间是280ms,最后总结,并发越高,fullgc时间越长,因为创建对象速度快,可能刚刚释放,又要创建又要fullgc

再测试parnew+cms

-Xms4g -Xmx4g -Xss256k -XX:MaxMetaspaceSize=512m  -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/test.hprof  -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

在这里插入图片描述

50并发下最大的响应时间是220ms,其实都差不多

最后测试g1,在jdk17上

在这里插入图片描述

在这里插入图片描述

平均不到100ms,差距还是非常明显的。

2.4 实战

在这里插入图片描述

分析出有很多缓存对象

如果想要生成内存快照时不做fullgc,则需要通过jmap来保存,去掉live即可

jmap -dump:format=b,file=/home/jvm/dump/jvm-optimize-jmap.hprof 29317

但是mat分析时还是会自动把能回收的对象排除在外,所以我们需要

在这里插入图片描述

找到了482M的对象,本应该是被回收的,但是这些数组已经不在gcroot的引用链上了,所以用回溯找是没法找到的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4.1 总结

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 首途第三十三套清新简约卡片风格蓝紫渐变色短视频模板 | 苹果CMSV10主题
  • 为什么考试总是无法发挥正常水平?
  • AI大模型日报#0610:港大等1bit大模型“解决AI能源需求”、谷歌开源TimesFM时序预测模型
  • 每日复盘-20240607
  • 温度传感器十大品牌
  • [C++数据结构之看懂就这一篇]图(上)
  • 【C++初阶学习】第十三弹——优先级队列及容器适配器
  • Dubbo动态服务下线
  • 整数反转(leetcode)
  • 中国自研的AI算力基建和服务的发展
  • [数据集][目标检测]厨房积水检测数据集VOC+YOLO格式88张2类别
  • Redis Key过期监听配置
  • nginx优化与防盗链【☆☆☆】
  • fastapi学习前置知识点
  • 前端工程化工具系列(十一)—— Babel(v7.24):JavaScript编译器
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • es6要点
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • js ES6 求数组的交集,并集,还有差集
  • Laravel 菜鸟晋级之路
  • Laravel 实践之路: 数据库迁移与数据填充
  • markdown编辑器简评
  • python docx文档转html页面
  • python 装饰器(一)
  • spring学习第二天
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue官网教程学习过程中值得记录的一些事情
  • 初识 beanstalkd
  • 从输入URL到页面加载发生了什么
  • 动态魔术使用DBMS_SQL
  • 前嗅ForeSpider教程:创建模板
  • 使用 QuickBI 搭建酷炫可视化分析
  • 学习HTTP相关知识笔记
  • 用Python写一份独特的元宵节祝福
  • 1.Ext JS 建立web开发工程
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​io --- 处理流的核心工具​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #QT(一种朴素的计算器实现方法)
  • #面试系列-腾讯后端一面
  • (02)Hive SQL编译成MapReduce任务的过程
  • (8)STL算法之替换
  • (WSI分类)WSI分类文献小综述 2024
  • (搬运以学习)flask 上下文的实现
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (南京观海微电子)——示波器使用介绍
  • (七)Java对象在Hibernate持久化层的状态
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1