Java Garbage Collection(GC)垃圾收集器介绍
Java Garbage Collection(GC)垃圾收集器介绍
芯学苑Java培训 发表于6个月前
Java Garbage Collection(GC)垃圾收集器介绍
  • 发表于 6个月前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

Garbage Collection 译为垃圾收集器(以下简称GC),主要负责内存分配、确保所有被引用的对象保留在内存中、将那些无法达到的对象引用所占用的内存回收。被引用的对象通常被称为活动的(live)。不再被引用的对象,认为是已经消亡,被称之为垃圾。寻找与释放对象占用空间的过程被称为垃圾收集/回收。

 

内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java 和C 之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM 来管理对象内存的分配以及对象内存的回收(GC)。

 

GC 其实是一种动态存储管理技术。主要是按照特定的垃圾收集算法(Garbage Collection Algorithm 简称GC算法)来实现自动资源回收的功能。简单地讲,就是将那些程序中显式释放内存的代码交由GC 在后台自动完成,能提供这种功能的编程语言,我们就说它支持GC,比如典型的Java、C#、Python 等,本文主要讨论HotSpot 系列Java 虚拟机中的GC。

 

高级编程语言采用GC 模式,省去了程序员自己管理内存的麻烦和危险。操作内存空间其实是极其危险的,稍有不慎可能导致内存泄漏(memory leak)或者悬空指针(dangling pointer)甚至整个系统崩溃。因此GC 的使用也一定程度上提升了系统的安全与稳定。

 

下图就描述了一个理想中系统模型,图中随着处理器的增加,GC花费时间不变的情况下所损失的吞吐量(可以简单的理解程序实际工作时间)。

 

Java Garbage Collection.png

 

当只花费1%时间去处理垃圾时,在32个处理器环境下最终损失了20%多的吞吐量,也就是说程序处理能力下降了20%多。

 

随着在GC 上花费时间越来越多,程序损失的吞吐量也在呈抛物线迅速上涨。当花费30%时间在GC 上时,程序几乎已经瘫痪,已经失去了运行的意义。

 

由此可见,在开发小型程序时我们往往可以不去关注GC 方面的优化及处理,但一旦系统规模庞大后,你就再也无法忽视这方面性能上的差异,几处微不足道的改良可能会获得性能大幅提升,所以无论在任何系统开发中都应该着重关注GC 方面的问题。

 

GC 的设计选择:

(1)串行回收(Serial)VS并行回收(Parallel)

串行就是不管有多少个CPU,始终只有一个CPU用来执行回收操作,而并行就是把整个回收工作拆分成多个,由多个CPU同时执行。并行回收执行会快,但复杂度增加,另外也有其他一些副作用,比如内存碎片会增加。

 

(2)并发执行(Concurrent)VS应用程序停止(Stop-the-world)

Stop-the-world的GC方式在执行GC的同时会导致应用程序的暂停。并发执行的GC虽然不会导致应用程序的暂停,但由于并发执行GC要解决和应用程序的执行冲突(应用程序可能会在GC的过称中修改对象),并发执行GC执行的消耗会高于Stop-the-world,而且执行也需要更多的内存堆。

 

(3)压缩(Compacting)VS不压缩(Non-compacting)VS拷贝(Copying)

为了减少内存碎片,支持压缩的GC会把所有的活对象搬迁到一起,然后将之前占用的内存全部回收。不压缩式的GC顾名思义就是在GC的过程中不压缩内存,较之压缩式的GC,不压缩式的GC回收内存快了,而分配内存慢了,而且无法解决内存碎片的问题。拷贝式的GC会将活对象拷贝到不同的内存区域中,这种方式的优点是源数据可以被认为已经清空并可以用来分配,缺点也很明显,需要拷贝数据和额外的内存。

 

GC 几种重要的性能指标:

(1)Throughput: 经过长期运行后除去GC 处理时间系统实际执行时间所占全部时间的百分比。

(2)Garbage collection overhead: GC 开销,吞吐量的倒数,也就是说,在垃圾收集上花费的总时间的百分比。

(3)Pause time: 程序执行期间暂停的时间,程序暂停后GC 开始工作,即前面说的stop-the-world 时间。

(4)Frequency of collection: 相对于程序执行垃圾收集发生的频率。

(5)Footprint: 一些参数的大小,例如堆大小(Heap Size)。

(6)Promptness: 对象变为垃圾后到该内存被清理的时间。

 

此时我们还需要了解一些其他事情。

(1)默认的本文以Hotspot JVM(版本1.5以上) 类型虚拟机为基础讨论。

 

(2)在J2SE1.4版本之前,JVM 是不支持并行GC的。

 

(3)名词"Stop-the-world",Stop-the-world 会在任何一种GC算法中发生。Stop-the-world 意味着JVM 因为要执行GC而停止了应用程序的执行。当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态,直到GC任务完成。GC优化很多时候就是指减少Stop-the-world发生的时间。

 

(4)默认本文讨论GC 内存收集区域为Heap,方法区暂不考虑。

默认的Hotspot 系列虚拟机采用分代方式对Heap 内存进行管理与垃圾清除,Heap Memory 被分为两大区域:

 

- Young/New Generation 新生代

新生对象放置在新生代中,新生代由Eden 与Survivor Space 组成。

 

- Old/Tenured Generation 老年代

老年代用于存放程序中经过几次垃圾回收后还活动的对象

 

 

零基础学Java.jpg

 

共有 人打赏支持
粉丝 0
博文 18
码字总数 16977
×
芯学苑Java培训
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: