详解JVM中的GC调优
作者:flydean 发布时间:2023-09-20 15:49:27
那些GC的默认值
其实GC或者说JVM的参数非常非常的多,有控制内存使用的:
有控制JIT的:
有控制分代比例的,也有控制GC并发的:
当然,大部分的参数其实并不需要我们自行去调整,JVM会很好的动态帮我们设置这些变量的值。
如果我们不去设置这些值,那么对GC性能比较有影响的参数和他们的默认值有哪些呢?
GC的选择
我们知道JVM中的GC有很多种,不同的GC选择对java程序的性能影响还是比较大的。
在JDK9之后,G1已经是默认的垃圾回收器了。
我们看一下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


猜你喜欢
- 前言Date 类Date 类表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。构造方法
- 首先是网页部分,upload_file.jsp<%@ page language="java" import=&q
- 1、添加依赖<dependency> <groupId>org.springframewo
- 废话不多说了,直接给大家贴代码了,具体代码如下所述:/*** 把一个View的对象转换成bitmap*/private Bitmap get
- 概述新版的音悦台 APP 播放页面交互非常有意思,可以把播放器往下拖动,然后在底部悬浮一个小框,还可以左右拖动,然后回弹的时候也会有相应的效
- IComparable<T>.NET 里,IComparable<T>是用来作比较的最常用接口。如果某个类型的实例需
- 一,功能效果二,实现过程1,先写xml文件:dialog_keyboard.xml 注意事项(1),密码
- 最近做了一个项目中,其中遇到这样的需求要求图片移动到手指触碰的地方。具体实现代码如下所示:package com.example.plane
- 本文实例讲述了C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法。分享给大家供大家参考。具体如下:1.示例图P(x1,y1)以点A(a
- 最近在学习AngularJS的知识,收获不少,不过因为自己平时工作时开发都是用的freemarker+springmvc来做的页面数据交互,
- C#字符串提取数值(带小数点)string input = "树2草45210.2m2";if (GetInputUti
- RandomAccessFileRandomAccessFile 是随机访问文件(包括读/写)的类。它支持对文件随机访问的读取和写入,即我们
- 01: 异步任务02: 定时任务一、SpringBoot--任务:邮件任务1.1 添加依赖(增加邮件支持)pom.xml <depen
- 1.根据入参带分页参数进行sql查询分页 Criteria criteria = n
- 该方法把该字符串转换成一个新的字符数组。 String str="abcdefg"; char a[]; a=str.t
- 今天预实现一功能,将txt中的数据转到excel表中,做为matlab的数据源。搜集一些c#操作excel的程序。步骤如下:下载一个Micr
- 外观模式: 又称门面模式: 外观Facade为子系统的一组接口提供一个一致界面,使得这组子系统易于使用(通过引入一个新的外观角色降低原系统复
- Unity脚本自动添加头部注释就是创建.cs文件时自动添加作者名,创建时间,文件名等看示例,我们在Unity的project面板下先创建一个
- 前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。追查原因之后发现,这个事情没想象中简单,可以说一
- mapper.xml文件<?xml version="1.0" encoding="UTF-8"