Java性能优化——GC垃圾收集调优基础

前言

Java性能优化永远绕不开的话题之一 ———— 垃圾收集调优,Java最诱人的特性之一是不需要显式地管理对象的生命周期:我们可以在需要时创建对象,对象不再被使用时,会由JVM在后台自动进行回收。

但是这个特性是把双刃剑,JVM为我们屏蔽了内存管理的冗杂操作,但是在上层的开发人员,在他根本不熟悉JVM的前提上,他对Java语言的认识还不够全面,导致在代码的书写过程中,可能会埋下内存溢出的隐患。

在我们熟知的很多开发规范开发守则中,对隐式的内存使用都会有对应的规范,比如对集合类的大小进行预先设置,对IO类的资源释放操作。这些规范都是让我们更好的使用内存,让代码具有更好的性能。

在C语言中,各种开放式的代码和编译奇葩结果让开发人员无法专心于核心业务上,Java语言和其周边生态的出现,唯一的目的就是让开发人员可以专注于核心业务,不用去纠结一些底层的管理和额外框架的交互。

正因为这样,我们要在代码上精益求精,在日常的服务日志查看中,看是否有存在性能瓶颈。及时进行修正,避免导致错误结果。所以对于开发人员来讲,JVM的垃圾收集机制和主流的垃圾收集器是必定需要了解的。

垃圾收集基本概念

垃圾收集简单的表述的话,基本操作有三个步骤:

  1. 查找不再使用的对象
  2. 释放这些对象的内存空间
  3. 对堆的内存布局进行压缩整理。

所有的垃圾收集器和GC算法都是围绕着以上三个基本操作去实现的。完成这些基本操作时,不同的收集器采用了不同的方法,这也是不同的垃圾收集器表现出不同性能的特征。

分代机制

在JVM的内存模型中,将堆划分成了不同的代(Generation),主要分为新生代和老年代,新生代还划分出来Eden区和Survivor区,采用分代机制的原因就是很多对象的生存时间非常短,大多数都是临时对象,垃圾收集线程扫描部分堆空间肯定是要比扫描整个堆要快得多,还有比如JVM开启了逃逸分析(-XX:+DoEscapeAnalysis(开启))的话,可能会进行的优化有一项是JVM编译器会直接在线程的寄存器中去操作临时对象,根本不会在堆上进行分配。对于新生代的划分,在垃圾收集线程中,会在Eden区和Sur

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值