详解JVM中的GC调优

作者:flydean 时间:2023-09-20 15:49:27 

那些GC的默认值

其实GC或者说JVM的参数非常非常的多,有控制内存使用的:

详解JVM中的GC调优

有控制JIT的:

详解JVM中的GC调优

有控制分代比例的,也有控制GC并发的:

详解JVM中的GC调优

当然,大部分的参数其实并不需要我们自行去调整,JVM会很好的动态帮我们设置这些变量的值。

如果我们不去设置这些值,那么对GC性能比较有影响的参数和他们的默认值有哪些呢?

GC的选择

我们知道JVM中的GC有很多种,不同的GC选择对java程序的性能影响还是比较大的。

在JDK9之后,G1已经是默认的垃圾回收器了。

详解JVM中的GC调优

我们看一下G1的调优参数。

G1是基于分代技术的,其实JVM还在开发一些不再基于分代技术的GC算法,比如ZGC,我们可以根据需要来选择适合我们的GC算法。

GC的最大线程个数

GC是由专门的GC线程来执行的,并不是说GC线程越多越好,这个默认线程的最大值是由heap size和可用的CPU资源动态决定的。

当然你可以使用下面两个选项来修改GC的线程:

 -XX:ParallelGCThreads=threads 设置STW的垃圾收集线程数

 -XX:ConcGCThreads = n 设置并行标记线程的数量

一般情况下ConcGCThreads可以设置为ParallelGCThreads的1/4。

初始化heap size

默认情况下加初始化的heap size是物理内存的1/64。

你可以使用

 -XX:InitialHeapSize=size

来重新设置。

最大的heap size

默认情况下最大的heap size是物理内存的1/4。

你可以使用:

-XX:MaxHeapSize

来重新设置。

分层编译技术

默认情况下分层编译技术是开启的。你可以使用:

-XX:-TieredCompilation

来关闭分层编译。如果启用了分层编译,那么可能需要关注JIT中的C1和C2编译器带来的影响。

我们到底要什么

java程序在运行过程中,会发生很多次GC,那么我们其实是有两种统计口径:

1.平均每次GC执行导致程序暂停的时间(Maximum Pause-Time Goal)。

2.总的花费在GC上的时间和应用执行时间的比例(Throughput Goal)。

最大暂停时间

单次GC的暂停时间是一个统计平均值,因为单次GC的时间其实是不可控的,但是取了平均值,GC就可以动态去调整heap的大小,或者其他的一些GC参数,从而保证每次GC的时间不会超过这个平均值。

我们可以通过设置:

-XX:MaxGCPauseMillis=<nnn>

来控制这个值。

不管怎么设置这个参数,总体需要被GC的对象肯定是固定的,如果单次GC暂停时间比较短,可能会需要减少heap size的大小,那么回收的对象也比较少。这样就会导致GC的频率增加。从而导致GC的总时间增加,影响程序的Throughput。

吞吐率

吞吐率是由花费在GC上的时间和应用程序上的时间比率来决定的。

我们可以通过设置:

-XX:GCTimeRatio=nnn

来控制。

如果没有达到throughput的目标,那么GC可能会去增加heap size,从而减少GC的执行频率。但是这样会增加单次的Maximum Pause-Time。

如果throughput和maximum pause-time的参数同时都设置的话,JVM会去尝试去动态减少heap size的大小,直到其中的一个目标不能满足为止。

相对而言,G1更加偏重于最大暂停时间,而ZGC更加偏重于吞吐率。

来源:https://www.cnblogs.com/flydean/p/jvm-diagnostic-gc.html

标签:JVM,GC,调优
0
投稿

猜你喜欢

  • Spring boot 集成Dubbox的方法示例

    2023-09-22 23:49:04
  • 详解SpringBoot程序启动时执行初始化代码

    2022-05-07 13:36:05
  • C#和Java有什么区别和联系

    2022-01-02 04:33:26
  • Android关于Button背景或样式失效问题解决方法

    2021-12-28 03:21:06
  • Session过期后自动跳转到登录页面的实例代码

    2022-01-30 13:48:56
  • 解决Unity无限滚动复用列表的问题

    2022-12-26 04:42:18
  • Spring Boot ActiveMQ连接池配置过程解析

    2023-11-08 23:08:02
  • Spring Security 中如何让上级拥有下级的所有权限(案例分析)

    2022-01-28 16:55:26
  • Dagger2 Android依赖注入学习笔记

    2021-11-27 17:15:54
  • Java实现将每日新闻添加到自己博客中

    2023-02-08 16:20:43
  • C#模拟实现鼠标自动点击与消息发送功能

    2023-02-09 08:51:14
  • 快速了解hibernate配置文件与映射文件

    2023-11-04 23:02:26
  • Android 异步任务 设置 超时使用handler更新通知功能

    2022-07-13 02:10:54
  • Android 4.0 设置全屏修改的解决方法

    2022-11-24 17:08:12
  • 使用Spring自定义注解实现任务路由的方法

    2023-12-20 22:34:11
  • Jmeter配置代理实现录制过程图解

    2022-01-15 20:25:32
  • c#中SqlTransaction——事务详解

    2022-12-16 15:40:54
  • Android开发实现抽屉菜单

    2022-09-01 11:47:09
  • springcloud-gateway集成knife4j的示例详解

    2023-11-29 08:56:44
  • Android获取经纬度计算距离介绍

    2022-04-30 20:00:04
  • asp之家 软件编程 m.aspxhome.com