如何减少长时间的GC暂停?

长时间的GC暂停会影响应用程序性能,本文列举了可能导致此问题的原因,包括高对象创建率、年轻的代大小不合适、选择合适的GC算法、内存交换、调整GC线程数、后台IO流量以及System.gc()调用,并提供了相应的解决方案,如使用Java Profiler优化对象创建、调整JVM参数等。
摘要由CSDN通过智能技术生成

长时间的GC暂停对于应用程序而言是不可取的。它会影响您的SLA,导致不良的客户体验,并对关键任务应用程序造成严重损害。因此,在本文中,我列出了可能导致长时间GC暂停的主要原因,以及解决这些问题的潜在解决方案。
1.高对象创造率
如果您的应用程序的对象创建率很高,那么为了跟上它,垃圾回收率也将很高。高垃圾回收率也会增加GC暂停时间。因此,优化应用程序以创建更少的对象是减少长时间GC暂停的有效策略。这可能是一个耗时的练习,但值得100%进行。为了优化应用程序中的对象创建速率,可以考虑使用Java Profiler(如 JProfiler, YourKit或JVisualVM)。这些分析器将报告:

创建了哪些对象?


这些对象的创建速率是多少?


它们在内存中占用多少空间?


谁在创造它们?

始终尝试优化占用最大内存量的对象。追捕池塘里的大鱼。
.年龄不足的年轻一代
当年轻一代过小时,对象会过早地提升到老一代。从年轻一代收集垃圾比从年轻一代收集垃圾要花费更多的时间。因此,增加年轻代的大小有可能减少长时间的GC暂停。可以通过设置两个JVM参数之一来增加年轻一代的大小
-Xmn:指定年轻代的大小。
-XX:NewRatio:指定年轻一代相对于老一代的大小。例如,设置-XX:NewRatio = 2表示老一代与年轻一代之间的比率为1:2。年轻一代将是整个堆的一半。因此,如果堆大小为2 GB,则年轻代大小将为1 GB。
3. GC算法的选择
GC算法对GC暂停时间有很大影响。如果您是GC专家或打算成为一名GC专家(或者您团队中的某人是GC专家),则可以调整GC设置以获得最佳的GC暂停时间。如果您没有很多GC专业知识,那么我建议您使用G1 GC算法,因为它具有 自动调整 功能。在G1 GC中,您可以使用系统属性“ -XX:MaxGCPauseMillis”设置GC暂停时间目标。例:

  • XX:MaxGCPauseMillis = 200

根据上面的示例,最大GC暂停时间设置为200毫秒。这是一个软目标,JVM将尽力实现这一目标。
4.交换流程
有时由于缺少内存(RAM),操作系统可能会从内存中交换应用程序。交换非常昂贵,因为它需要磁盘访问,与物理内存访问相比要慢得多。以我的拙见,在生产环境中没有认真的应用可以互换。交换过程时,GC将花费很长时间才能完成。
下面是从StackOverflow获得的脚本 (感谢作者),该脚本 在执行时将显示所有正在交换的进程。请确保您的进程没有被交换。

#!/bin/bash

Get current swap usage for all running processes

Erik Ljungstrom 27/05/2011

Modified by Mikko Rantalainen 2012-08-09

Pip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值