java gc 时间过长_GC 时间过长的问题处理思考

本文探讨了如何处理Java G1垃圾收集器导致的长时间GC问题,从编码、JVM配置和操作系统层面提出解决方案,包括减少对象创建、调整堆内存分配、优化并发线程数以及禁用Linux交换分区等策略。
摘要由CSDN通过智能技术生成

零 前述

本文以 G1 作为主视角来做对策分析。jdk8 中将 GC 调整为 G1 -XX:+UseG1GC

一 从编码层面来说

1 减少对象的创建频率

尽量复用以前存在的对象,减少对象创建,那么就能减少 gc 的频率。

方法有:单例模式

享元模式

静态对象

枚举类

对象池技术

用 StringBuilder 和 IntegerCache 等方法去代替直接创建对象

2 从根本上减少堆内存的使用

使用其它内存方式代替堆内存。当一个对象的使用生命周期被囊括在栈的生命周期内,此时 jvm 会通过逃逸分析判断该对象不需要在堆上分配内存,只需要创建在栈内存中就可以了。栈内存是没有 gc 的,等栈的生命周期结束就被全部删除了

注意设置好 jvm 栈内存的大小,不要 OOM

也可以使用 Unsafe 去操作元空间的内存,但是要注意控制手动释放

涉及参数设置:设置栈内存的大小,单位 kb -Xss:1024

开启逃逸分析,默认就是开启的 -XX:+DoEscapeAnalysis

3 小对象代替大对象

小对象对于 jvm 来说,是会直接创建在 eden 区的,但是大对象则会直接被分配在老年代。老年代比 eden 大很多,gc 起来更加费力。默认情况下,只要 eden 区有足够的连续空间,不论多大的对象都会分配在 eden 区,这会导致 eden 区可能在短期内存在内存“碎片”,所以可以设置好 jvm 对大对象定义的阈值

尽量拆分大对象

如果确实有大对象,那么就尽量使用 part 1

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值