Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在Java中调整垃圾回收(翻译)

如何在Java中调整垃圾回收(翻译)

作者头像
日薪月亿
发布于 2019-05-14 06:32:03
发布于 2019-05-14 06:32:03
74300
代码可运行
举报
文章被收录于专栏:技术探索技术探索
运行总次数:0
代码可运行

原文地址how-to-tune-garbage-collection-in-java 由于时间仓促,翻译中会出现很多错误,欢迎校正。

垃圾收集是JVM在不再需要内存时代表应用程序回收内存的机制。从高层来看,它包括查找不再使用的对象,释放与这些对象相关联的内存,偶尔压缩堆以防止内存碎片化。

垃圾收集器使用一个或多个线程执行它的工作。但是为了完成跟踪对象引用和在内存中移动对象的工作,需要确保应用程序线程当前没有使用这些对象,举个例子,如果应用程序线程正在使用对象,则对象的内存位置会由于GC而发生更改,这是更坏和不可预测的事情。这就是垃圾收集器在执行某些任务时必须暂停所有应用程序线程的原因。这种暂停有时候被称作 Stop-The-Wolrd(STW)暂停,最小化它们是GC调整的首要关注点,因为它们对Java应用程序的性能会产生巨大影响。

堆的大小

垃圾收集优化的第一步是调整堆的大小。这是因为如果堆太小的话,会出现太多的GC来回收内存,这会降低应用程序的总吞吐量。如果堆太大,那么会有更少的GC,但是这些GC需要花费很长时间,响应时间指标会受到影响。并行收集器特别容易受到此问题的影响,因此如果需要大堆和低暂停时间,则应尝试使用G1GC收集器。

备注: 自Java 9以来,Concurrent Mark Sweep(CMS)收集器已被弃用, Shenandoah Garbage Collector垃圾收集器在撰写本文时仍被认为是“实验性的”。因此,如果您运行的是联机交互式应用程序,那么G1GC应该是您的默认选择,如果您运行的是脱机批处理应用程序,那么并行收集器应该是您的第一选择。

堆的大小由两个值控制:用ms参数指定的初始值和用mx参数指定的最大值 例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-Xms1g -Xmx8g

拥有堆的初始和最大大小允许JVM是根据工作负载自动调整堆大小。如果JVM遇到内存压力,并且发现它执行了太多的GC,它将不断增加堆,直到内存压力降低,或者直到堆达到其最大大小。如果内存压力很低,JVM还可以通过缩小堆大小来决定减少暂停时间。这个过程称为自适应大小调整,它不仅调整堆的总体大小,而且调整年轻代和老年代的大小和比率。

如果您花了一些时间来微调应用程序的GC行为和大小,您可以选择关闭自适应大小调整。这可以节省JVM,即计算堆大小所需的一小段时间。您可以通过将参数useAdaptiveSizePolicy设置为false来完成此操作。 例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:-UseAdaptiveSizePolicy

另外,将初始堆大小设置为与最大堆大小相同的值,或将初始新生代大小设置为与最大新生代大小相同的值,可以有效地关闭部分自适应大小调整行为。

强烈建议设置最大堆大小的准则是:最大堆大小不应超过计算机上的物理内存量。如果有多个JVM在运行,那么最大堆大小之和不应该超过机器的物理内存。

设置最大堆大小的一个更一般的建议是,应该设置该大小,以便在完全GC之后堆占满30%。要计算这个值,您可以在GC日志中查找发生完整GC的条目,并观察GC完成时使用了多少内存。或者,您可以运行应用程序,直到它达到稳定状态,然后使用jconsolejcmd强制执行完整的GC。

GC性能调优

如果启用了自适应大小调整,则可以使用MaxGCPauseMillis参数来调整GC行为。此标志为最大GC暂停时间设置目标。当与并行收集器一起使用时,JVM将调整年轻一代和老年一代的大小,以尝试实现目标。然后,它将调整堆的大小,以便在GC中花费的时间不超过某个值,默认情况下,该值为1%。

G1GC的目标之一是它将需要最小的调优。因此,在G1GC中,一个调优参数maxgcpausemillis执行以下所有优化,以尝试实现指定的暂停时间目标:

  • 调整堆的大小,
  • 尽快开始后台处理,
  • 调整要提升到老年代的对象的寿命阈值,
  • 调整在混合GC循环期间处理的老年代数。 在G1GC中,参数的默认值是200ms,虽然您可能会尝试将其设置为非常小的值,如20 ms,但请注意,为了实现此目的,垃圾收集器将把新生代缩小到非常小的大小,并收集较少的老年代,这最终会导致出现垃圾太多的情况。老年代和系统必须执行完整的GC,这是不可取的。

修复并发模式故障

G1GC是一个并发收集器。这意味着垃圾收集进程的某些阶段可以在应用程序线程仍在运行时并发运行。由于正在运行的应用程序可以继续产生垃圾,因此我们可能会遇到这样的情况:当垃圾收集器仍处于垃圾收集过程的中间时,应用程序将耗尽老年代内存。换句话说,正在运行的应用程序产生垃圾的速度比可以清除垃圾的速度要快。这种情况被称为并发模式故障,提升故障或疏散故障,具体取决于故障发生的时间。如果您在GC日志中看到很多这些错误,那么解决方案是要么增加堆的大小,更早地启动G1后台处理,要么通过使用更多的后台线程来加速GC处理。

要更频繁地执行g1后台活动,可以降低触发G1周期的阈值。这是通过减少InitiatingEapOccupancyPercent参数值来实现的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-XX:InitiatingHeapOccupancyPercent=45

默认情况下,这个参数设置为45。这意味着当堆填充45%时,将触发GC循环。减小这个值意味着GC将更早更频繁地被触发。但应注意的是,该值不能设置为太低的数字,这将导致GCS发生的频率太高。

要增加后台线程的数量,请使用concgthreads参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-xx:concgthreads=4

这个参数的默认值设置为ParallelGCThreads的值加上2,再除以4。只要机器上有足够的CPU可用,就可以增加该值,而不会造成任何性能损失。

如果调优堆大小和调优收集器对您不起作用,那么您可以尝试另一个收集器。如果您仍然没有得到好的结果,那么您需要考虑调整应用程序代码本身。

愉快的调优吧!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 14 Hotspot 虚拟机垃圾回收调优指南!
出处:www.cnblogs.com/sxpujs/p/12638114.html
Java技术栈
2020/06/16
5970
Java  14 Hotspot 虚拟机垃圾回收调优指南!
jvm之7种垃圾回收器解读(下)
既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First(G1)?
一个风轻云淡
2023/10/15
3400
jvm之7种垃圾回收器解读(下)
垃圾回收的常见算法
自动化的管理内存资源,垃圾回收机制必须要有一套算法来进行计算,那些是有效的对象,那些是无效的对象,对于无效的对象 就要进行回收处理。 常见的垃圾回收算法有 :引用计数法、标记清除法、标记压缩法、复制算法、分代算法等。
海仔
2019/08/05
3330
垃圾回收的常见算法
JVM之垃圾回收器
有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品我们称为Garbage Collector。
冬天vs不冷
2025/01/20
1660
JVM之垃圾回收器
垃圾回收器分类
有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品我们称为Garbage Collector。
编程之心
2021/07/14
7170
垃圾回收器分类
垃圾回收的常见算法
自动化的管理内存资源,垃圾回收机制必须要有一套算法来进行计算,那些是有效的对象,那些是无效的对象,对于无效的对象 就要进行回收处理。 常见的垃圾回收算法有 :引用计数法、标记清除法、标记压缩法、复制算法、分代算法等。
AI.NET 极客圈
2019/07/23
1.4K0
JVM内存与垃圾回收篇第17章垃圾回收器
有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品我们称为Garbage Collector。
yuanshuai
2022/08/17
4970
JVM内存与垃圾回收篇第17章垃圾回收器
G1垃圾回收器教程
garbage-first (G1)收集器是一个服务器风格的垃圾收集器,针对具有大内存的多处理器机器。它在同时实现高吞吐量的情况下,以很高的概率满足垃圾收集(GC)暂停(STW:stop the word)时间目标。G1垃圾收集器在Oracle JDK 7 update 4和更高版本中得到了完全支持。G1收集器专为以下应用程序设计:
伍六七AI编程
2022/11/14
6600
G1垃圾回收器教程
了解Java垃圾收集
Java 的垃圾收集机制在 Java 应用程序开发中至关重要。此机制对于通过消除不再使用的对象来释放内存空间得过程来说至关重要。在这篇文章中,我带大家深入了解下 Java 垃圾收集的机制,并探索其工作原理、优点以及实现最佳性能的最佳实践。
wayn
2024/06/03
1420
了解Java垃圾收集
JVM真香系列:图解垃圾回收器
并发收集:指用户线程与垃圾收集线程同时工作(不一定是并行的可能会交替执行)。用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。
田维常
2020/11/19
3970
JVM真香系列:图解垃圾回收器
java(9)-深入浅出GC垃圾回收机制
1、本文了解GC垃圾回收机制,深入理解GC后才明白,为啥FGC会导致stop-the-world。 2、了解GC算法。
黄规速
2022/04/14
9970
java(9)-深入浅出GC垃圾回收机制
jvm之7种垃圾回收器解读(上)
Serial收集器是最基本、历史最悠久的垃圾收集器了。JDK1.3之前回收新生代唯一的选择。
一个风轻云淡
2023/10/15
2330
jvm之7种垃圾回收器解读(上)
Java JVM 面试题
阿彬学java
2025/01/09
1110
Java虚拟机(三):JVM垃圾回收机制
垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。
朝雨忆轻尘
2019/06/19
2990
知道如何优化垃圾回收机制吗?
在 Java 开发中,开发人员是无需过度关注对象的回收与释放的,JVM 的垃圾回收机制可以减轻不少工作量。但完全交由 JVM 回收对象,也会增加回收性能的不确定性。在一些特殊的业务场景下,不合适的垃圾回收算法以及策略,都有可能导致系统性能下降。
田维常
2020/05/25
8380
G1 垃圾回收器
https://blog.51cto.com/u_15278282/3242908
Get
2024/03/21
1900
JAVA垃圾回收机制
PS:不管是调优也好,先是配合对应的新老对应的垃圾收集器,如果有必要才修改垃圾收集器的参数的,垃圾回收器如何标记垃圾,如何进行垃圾收集的,收集器有哪些?它们是如何配合的。
IT架构圈
2021/02/01
5640
JAVA垃圾回收机制
JVM之垃圾回收-垃圾收集器
如果说前面介绍的收集算法(JVM之垃圾回收-垃圾收集算法)是内存回收的抽象策略,那么垃圾收集器就是内存回收的具体实现。
谙忆
2021/01/21
5940
JVM之垃圾回收-垃圾收集器
【Java虚拟机】JVM垃圾回收器详解
总结:ZGC业界还没大规模使用,更多再实验性观望阶段,还存在变动和争议阶段,如果可能则预计26年~28年成为主流,当下我们开发的采用的垃圾收集器是G1收集器,23~25年会是主流。
互联网小阿祥
2023/05/28
8330
【Java虚拟机】JVM垃圾回收器详解
JVM常见面试题(四):垃圾回收
当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化"的技术实施必要的监控和调节。
寻求出路的程序媛
2024/11/24
1420
JVM常见面试题(四):垃圾回收
相关推荐
Java 14 Hotspot 虚拟机垃圾回收调优指南!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验