如何降低Java GC的开销

前言

堆中存放对象,栈中存放基本类型和堆中对象的引用
一个Object对象占用4+8bytes, 4bytes是栈中的引用,8bytes是堆中对象的实际大小。如果这个对象有个long属性,其大小为8+4+8bytes,但是对象必须是8的倍数,所以会补齐为24bytes.
JVM中分年轻代,老年代,永久代;其中年轻代有1个Eden和2个Survivor区。

新生代GCvs老年代GC

新对象在eden区申请空间失败后会触发minor gc,将存活对象移到一个未使用的Survivor区。
当老年代,永久代,显性调用System.gc()后会进行Full GC,对整个堆进行垃圾收集,速度很慢,故要减少Full GC的次数。

几种常用的垃圾收集器

串行收集器:适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。 缺点:只能用于小型应用
并行收集器:适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。 缺点:垃圾收集过程中应用响应时间可能加长
并发收集器:适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

当说到GC优化时,我们在说什么

  • 减少Stop the world发生的时间和频率
  • 减少转移到老年代对象的数量

几个建议

  • 预测集合的大小,避免频繁的数组扩容
  • 直接将InputStream传递给解析器,不要额外读取到byte[]
  • 使用不可变对象,能够减少GC暂停时间
  • 小心字符串拼接,虽然可能有编译器优化,但是可能产生大量的StringBuilder临时对象,所以还是直接使用StringBuilder吧
  • 减少使用包装类的容器,包装类很浪费空间。可以使用Trove框架,保存原生的数据类型。

参考文献

http://pengjiaheng.iteye.com/category/86293
http://www.importnew.com/author/wangxiaojie
后一篇特别好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值