避免长时间gc

关键词

  • 垃圾回收gc
    gc参考:https://blog.csdn.net/xyc1211/article/details/88594745

  • 削峰填谷Peak cut

  • Java的安全点 safepoint
    safepoint是一个记录指令OopMap(指针对象表 ordinary object pointer Map)的位置
    程序执行到了safepoint才能暂停执行, 让gc去回收内存垃圾

  • 可数循环(Counted Loop)、不可数循环(Uncounted Loop) 对safepoint的影响

    可数循环的时候 无法进入safepoint

  • jvm 执行native方法 对safepoint的影响

    执行native 会进入safepoint
    原因:native方法 是 jvm之外的代码。jvm调用外部的代码前,必须记录自身的状态 才能在native方法返回后继续执行,所以必须加入safepoint

背景

jvm虚拟机为了避免 safepoint过多带来过重的负担,有些代码是不给设置safepoint的

例如用int类型索引的for循环: 认为int类型比较小 属于 可数循环(Counted Loop),那循环次数不会很长,就不设置safepoint了

如果在没有safepoint的代码段做了大量耗时的操作,这段时间不会进行GC,一直等到出现了safepoint才会 触发一次长时间的GC,导致程序长时间STW

解决方案

  • 思路:
    对GC 打散运行,削峰填谷,运行多次短 GC,从而避免长GC,防止长时间的垃圾收集

方案1:人工加入safepoint

对于没有safepoint的代码段 ,每隔一段就执行 native 方法,人工触发进入Safepoint

//Thread.sleep(0) 是JNI调用,会进入safepoint
Thread.sleep(0)

方案2:无safepoint代码改为有safepoint的

可数循环(Counted Loop)改为 不可数循环(Uncounted Loop)
就是循环的索引 从 int 修改为 long。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
G1GC是一种垃圾回收器,它是Java虚拟机中的一部分,用于管理内存中的垃圾对象。G1GC的全称是Garbage-First,它采用了一种独特的垃圾回收策略,可以在多线程同时工作的情况下进行垃圾回收,并且可以与应用程序交替执行,不会完全阻塞应用程序。 G1GC的主要特点包括: - 分代回收:G1GC将堆内存划分为多个区域,每个区域称为一个分代。它会根据垃圾对象的分布情况,优先回收垃圾最多的分代。 - 并发回收:G1GC可以在应用程序运行的同时进行垃圾回收,减少了停顿时间。 - 区域化回收:G1GC将堆内存划分为多个区域,每个区域都可以独立进行垃圾回收,提高了回收效率。 - 可预测的停顿时间:G1GC通过控制每次垃圾回收的时间,可以实现可预测的停顿时间,避免长时间的停顿对应用程序性能的影响。 要在Tomcat中启用G1GC,可以按照以下步骤进行配置: 1. 打开Tomcat的启动脚本文件(如catalina.sh或catalina.bat)。 2. 在JAVA_OPTS环境变量中添加以下参数: ``` -XX:+UseG1GC -XX:MaxGCPauseMillis=<最大停顿时间> -XX:G1HeapRegionSize=<堆区域大小> ``` 其中,`<最大停顿时间>`是期望的最大停顿时间(以毫秒为单位),`<堆区域大小>`是每个堆区域的大小(以字节为单位)。 3. 保存并关闭启动脚本文件。 4. 重新启动Tomcat。 请注意,G1GC的配置参数可以根据具体的应用程序需求进行调整。建议根据实际情况进行性能测试和调优。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值