【Java虚拟机】JVM调优和分析案例综合实战

这篇具有很好参考价值的文章主要介绍了【Java虚拟机】JVM调优和分析案例综合实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.什么是JVM性能优化

jvm性能优化涉及到两个很重要的概念:吞吐量和响应时间。jvm调优主要是针对他们进行调整优化,达到一个理想的目标,根据业务确定目标是吞吐量优先还是响应时间优先。

  • 吞吐量:用户代码执行时间/(用户代码执行时间+GC执行时间)。
  • 响应时间:整个接口的响应时间(用户代码执行时间+GC执行时间),STW时间越短,响应时间越短。

调优方法论

  • 监控JVM性能

    • 对JVM的运行情况进行监控,以了解应用程序的瓶颈和性能瓶颈
    • 可以使用JVM自带的工具,如jstat、jmap、jstack等,或者第三方工具,如VisualVM、JProfiler等
  • 压测基准指标

    • 对程序进行压测,得出接口对应的吞吐量、响应时间等
    • 外部现象
      • 对用户体验来说,就是响应速度
      • 可以用压测工具jmeter进行压测得出相关性能指标
    • 内部现象:
      • 分析GC情况,是JVM性能调优的重要因素,需要掌握GC的工作机制和GC日志的含义
      • 可以使用JVM自带的GC日志或者第三方工具,如GCEasy等来分析GC情况,了解GC的频率、时间、内存占用等情况
  • 调整JVM参数

    • 通过调整堆大小、GC算法、线程池大小等参数来提高应用程序的性能
    • 注意:不同的应用程序和环境可能需要不同的JVM参数配置,比如IO密集型和CPU密集型应用
  • 二次压测分析

    • 通过调整jvm参数后,二次压测看性能指标提升还是下降
    • 内部:GC日志,看吞吐量,GC次数,停顿时间变化
    • 外部:接口对应的吞吐量、响应时间是否更优
  • 其他优化方式

    • 优化代码

      • 通过避免不必要的对象创建、减少同步操作、使用缓存等方式来优化代码。
      • 注意:代码优化应该遵循“先正确,再优化”的原则,不应该牺牲代码的可读性和可维护性
    • 使用并发编程

      • 使用多线程、线程池等方式来提高并发性能,比如调整线程池的队列长度,存活线程数量等
      • 注意:并发编程需要考虑线程安全和锁竞争等问题,需要进行正确的设计和实现
    • 使用缓存

      • 可以使用本地缓存、分布式缓存等方式来提高数据访问性能
      • 注意:缓存需要考虑缓存一致性和缓存失效等问题,需要进行正确的设计和实现
    • 避免IO阻塞

      • 使用异步IO、NIO等方式来提高IO性能,比如前面学的CompletableFuture异步任务编排
      • 注意:IO编程需要考虑并发性和可靠性等问题,需要进行正确的设计和实现
    • 分布式+集群技术

      • 使用负载均衡+集群技术,提升单节点的处理能力
2.JVM调优之压测环境准备
  • SpringBoot 编写的jar的程序,接口一个返回随机组成的100个以内的对象的list (使用JDK17)
/**
 * @author lixiang
 * @date 2023/5/8 21:44
 */
@Slf4j
@RestController
@RequestMapping("/spring-test")
public class SpringTestController {

    @RequestMapping("query")
    public Map<String, Object> query() throws InterruptedException {

        int num = (int) (Math.random() * 100) + 1;
        //申请5MB内存
        Byte[] bytes = new Byte[5 * 1024 * 1024];

        List<Product> productList = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Product product = new Product();
            product.setPrice((int) Math.random() * 100);
            product.setTitle("商品编号" + i);
            productList.add(product);
        }

        Thread.sleep(5);
        Map<String, Object> map = new HashMap<>(16);
        map.put("data", productList);
        return map;

    }

}
  • Jmeter压测工具准备,测试计划 200并发,循环500次
3.JVM性能优化之堆大小配置
  • 堆大小配置,FullGC次数的性能影响
  • 性能优化初始值
-Xms1g # 配置初始堆内存1G
-Xmx1g # 配置最大堆内存1G
-XX:+UseG1GC # 使用G1回收器
-XX:MaxGCPauseMillis=200 # 设置最大停顿时间200ms
-XX:G1HeapRegionSize=32M # 设置G1每个region块大小为32M
-XX:ActiveProcessorCount=8 # 设置JVM使用的CPU核数限制为8
-XX:+HeapDumpOnOutOfMemoryError # 当JVM发生OOM时,自动生成DUMP文件
-XX:HeapDumpPath=heapdump.hprof # DUMP文件路径
-XX:+PrintCommandLineFlags # 监控开启
-Xlog:gc=info:file=portal_gc.log:utctime,level,tags:filecount=50,filesize=100M 
  # Xlog:指定日志输出方式为日志文件。
  # gc*:指定日志输出类型为GC相关的日志。
  # info:指定输出日志的级别为info级别。
  # file=portal_gc.log:指定日志输出的文件名为portal_gc.log。
  # utctime:指定日志输出的时间戳使用UTC时间。
  # level,tags:指定日志输出的格式包含级别和标签信息。
  # filecount=50:指定最多保存50个日志文件。
  # filesize=100M:指定每个日志文件的大小为100MB。
  • 机器配置为:8核16G 500M带宽

【Java虚拟机】JVM调优和分析案例综合实战

  • 设置初始堆内存和最大堆内存为1G,压测
nohup java -jar spring-test-1.0-SNAPSHOT.jar -Xms1g -Xmx1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32M -XX:ActiveProcessorCount=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/jmeter/heapdump.hprof -XX:+PrintCommandLineFlags -Xlog:gc=info:file=/usr/local/jmeter/portal_gc.log:utctime,level,tags:filecount=50,filesize=100M &

【Java虚拟机】JVM调优和分析案例综合实战【Java虚拟机】JVM调优和分析案例综合实战

当我们设置堆内存为1G的时候,整体的吞吐量为40%以上,这已经很低了,期间Young GC发生了7451次,Full GC发生了142次

  • 设置初始堆内存和最大堆内存为2G,压测
nohup java -jar spring-test-1.0-SNAPSHOT.jar -Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32M -XX:ActiveProcessorCount=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/jmeter/heapdump.hprof -XX:+PrintCommandLineFlags -Xlog:gc=info:file=/usr/local/jmeter/portal_gc.log:utctime,level,tags:filecount=50,filesize=100M &

【Java虚拟机】JVM调优和分析案例综合实战【Java虚拟机】JVM调优和分析案例综合实战

我们将堆内存设置为2G的时候,相比于1G的吞吐量提升到70%以上,并且Young GC次数为752,Full GC次数为6次,相比1G提升了一倍。

  • 设置初始堆内存和最大堆内存为4G,压测
nohup java -jar spring-test-1.0-SNAPSHOT.jar -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32M -XX:ActiveProcessorCount=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/jmeter/heapdump.hprof -XX:+PrintCommandLineFlags -Xlog:gc=info:file=/usr/local/jmeter/portal_gc.log:utctime,level,tags:filecount=50,filesize=100M &

【Java虚拟机】JVM调优和分析案例综合实战【Java虚拟机】JVM调优和分析案例综合实战

当把堆内存设置为4G的时候,整体的吞吐量提升到76%,Young GC发生了504,一次Full GC都没有发生。

  • 设置初始堆内存和最大堆内存为6G,压测
nohup java -jar spring-test-1.0-SNAPSHOT.jar -Xms6g -Xmx6g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32M -XX:ActiveProcessorCount=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/jmeter/heapdump.hprof -XX:+PrintCommandLineFlags -Xlog:gc=info:file=/usr/local/jmeter/portal_gc.log:utctime,level,tags:filecount=50,filesize=100M &

【Java虚拟机】JVM调优和分析案例综合实战【Java虚拟机】JVM调优和分析案例综合实战

当把堆内存设置为6G的时候,整体吞吐量到达87%,Yong GC发生了196次,Full GC发生了0次。

总结:通过对堆内存的调整,发现4G是投入产出比最高的参数配置,所以当前配置可以采用4G的堆内存。

4.JVM性能优化之收集器配置

通过上面配置堆内存我们得出4G是当前机器和应用配置的最佳堆内存,这里我们不改变堆内存的大小,采用4G的堆内存,改变垃圾收集器,看看对接口吞吐量的影响。

这里我们采用ParallelGC,目前G1垃圾器在对于并发量大的应用来说,已经是最优的选择啦,我们这里用ParallelGC主要做一个对比。

nohup java -jar spring-test-1.0-SNAPSHOT.jar -Xms4g -Xmx4g -XX:+UseParallelGC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=32M -XX:ActiveProcessorCount=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/jmeter/heapdump.hprof -XX:+PrintCommandLineFlags -Xlog:gc=info:file=/usr/local/jmeter/portal_gc.log:utctime,level,tags:filecount=50,filesize=100M &

【Java虚拟机】JVM调优和分析案例综合实战
【Java虚拟机】JVM调优和分析案例综合实战文章来源地址https://www.toymoban.com/news/detail-437794.html

到了这里,关于【Java虚拟机】JVM调优和分析案例综合实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面试官:如何进行 JVM 调优(附真实案例)

    面试官:在工作中做过 JVM 调优吗?讲讲做过哪些 JVM 调优? 我一个QPS不到10的项目,上次问我缓存穿透缓存雪崩,这次问我 JVM 调优,我是真滴难。 不过大家别慌,热心的我给大家找来了几个满分回答,大家选择合适的使用。 回答1:听好了,下面将是我第一次 JVM 调优。 回

    2024年01月19日
    浏览(56)
  • StringTable调优和直接内存释放原理

    2024年02月14日
    浏览(39)
  • JVM实战(19)——JVM调优工具概述

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月18日
    浏览(51)
  • JVM调优实战

    用top命令,看看是哪个进程CPU占用率高,获取它的进程ID,再根据具体的进程id,执行 top -HP 进程id号  命令,看看哪个线程的CPU占用率高,如果是业务线程出现问题,则根据线程ID去检查业务代码;如果是GC线程占用率高,去看看日志再确定具体问题(有可能发生内存泄漏)。

    2024年02月07日
    浏览(33)
  • JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈

    JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、运行时数据区 二、Java虚拟机栈 1.栈帧的组成 2.局部变量表 3.操作数栈 4.帧数据 总结 JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具

    2024年01月20日
    浏览(42)
  • JVM——StringTable面试案例+垃圾回收+性能调优+直接内存

    JVM——引言+JVM内存结构_北岭山脚鼠鼠的博客-CSDN博客 书接上回内存结构——方法区。 这里常量池是运行时常量池。 intern()方法  intern() 方法用于在运行时将字符串添加到内部的字符串池stringtable中,并返回字符串池stringtable中的引用。 返回值 当调用 intern() 方法时,如果字符

    2024年02月12日
    浏览(47)
  • JVM实战篇:GC调优

    目录 一.GC调优的核心指标 1.1吞吐量(Throughput) 1.2延迟(Latency) 1.3内存使用量 二.GC调优的方法 2.1监控工具 Jstat工具 VisualVm插件 Prometheus + Grafana 2.2诊断原因 GC日志 GC Viewer GCeasy 2.3常见的GC模式 正常情况 缓存对象过多 内存泄漏 持续的FULL GC 元空间不足导致的FULL GC 三.修复G

    2024年01月23日
    浏览(42)
  • 11-JVM调优实战-1

    上一篇:10-JVM调优工具详解 jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况 S0C:第一个幸存区的大小,单位KB S1C:第二个幸存区的大小 S0U:第一个幸存区的使用大小 S1U:第二个幸存区的使用大小 EC:伊甸园区的大小 EU:伊甸园区的使用大小 OC:老年代大小 OU:

    2024年02月09日
    浏览(37)
  • 13-JVM调优实战-3

    上一篇:12-JVM调优实战-2 今天来介绍一款阿里巴巴的调优工具。 Arthas详解 Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,详见:https://arthas.aliyun.com/ 得益于 Arthas 强大且

    2024年02月09日
    浏览(37)
  • Elasticsearch大数据量写入调优和原理解析

    千万、亿级别数据批量写入ES的调优和原理解析 Elasticsearch version (bin/elasticsearch --version): 7.8   Plugins installed: kibana   JVM version (java -version): java version \\\"1.8.0_102\\\" OS version (uname -a if on a Unix-like system): Linux 4.9.0-4-amd64 #1 SMP Debian 4.9.65-3 (2017-12-03) x86_64 GNU/Linux ES节点:3台,4C16G,JVM8G E

    2023年04月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包