Java垃圾回收(GC)系列三 垃圾收集描述

本系列教程主要讲解Java垃圾回收机制,文章内容是翻译oracle官网的相关文档,有兴趣的同学可以查看官网英文版,具体地址:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

本章节内容主要介绍垃圾收集描述。

垃圾收集描述

什么是自动垃圾收集?

自动垃圾收集是观察Java堆内存的过程,识别哪些对象正在使用,哪些没有使用,并且删除不用的对象。一个正在使对象或一个引用对象,意味着程序的某些部分仍然持有指向该对象的指针。一个不用的对象或未引用的对象,不再被程序的任何部分引用。因此,未引用的对象所使用的内存可以被回收。

在一个像C这样的编程语言中,分配和释放内存是一个手动过程。在Java中,回收内存的过程由垃圾收集器自动处理。基本的过程可以描述如下。

步骤1:标记

这个过程的第一步叫做标记。这是垃圾收集器识别哪些内存正在使用、哪些不是的地方。

各模块翻译如下:

  • Before Marking --> 标记之前
  • After Marking --> 标记之后
  • Alive Object --> 存活的对象
  • Unreferenced Objects --> 不再引用的对象
  • Memory Space --> 内存区

应用的对象用蓝色显示,不再引用的对象用金色显示。在标记阶段对扫描所有对象,以做出决定。如果系统中的所有对象都必须被扫描,将是一个非常耗时的过程。

第二步:正常清理

正常清理移除不再引用的对象,留下引用的对象和指向空闲空间的指针。

各模块翻译如下:

  • Normal Deletion --> 正常清理
  • After normal deletion --> 正常清理之后
  • Memory Allocator holds a list of references to free spaces,and allocated memory sequentially then on.--> 内存分配器持有一个空闲空间引用的列表,然后按顺序分配内存。

为什么分代垃圾收集?

如之前所诉,必须标记和整理JVM中所有对象是低效的。随着越来越多的对象被分配,对象的列表越来越长,从而导致越来越长的垃圾收集时间。然而,应用程序的实证分析表明,大多数的对象都是短命的(生命周期短)。

这里有一个这样数据的列子。Y轴表示分配的字节数,X轴增长表示随时间分配的字节数。

 

各模块翻译如下:

  • Minor collections --> 较小的收集
  • Major collections --> 主要的收集
  • Bytes surviving --> 继续存活的字节
  • Bytes allocated --> 分配的字节

正如你所看到的那样,随着时间的推移,越来越少的对象保持分配。实际上,大多数对象的生命周期都很短,如图左面的高值所示。

JVM分代

从对象分配行为中学到的信息可以用来提高JVM的性能。因此,堆被分解成更小的部分或分代。堆的部分是:年轻代、老的或终身代,以及永久代。

各模块翻译如下:

  • Young Generation --> 年轻代
  • eden --> 伊甸园
  • Survivor Space -->  存活区
  • S0、S1 --> 存活0、存活1
  • Old Generation --> 老年代
  • Tenured --> 终身的
  • Permanent Generation --> 永久代
  • Permanent --> 永久的

年轻代是所有新对象被分配和老化的地方。当年轻代填满时,将导致一个小的垃圾收集。小收集可以优化假设高死亡率的对象。年轻代的消亡对象被迅速收集起来。一些幸存的对象已经老化,最终移到老年代。

停止领域事件--所有小的垃圾收集都是“停止领域”时间。这意味着在操作完成之前,所有应用程序线程都将停止。小的垃圾收集总是停止领域事件。

老年代被用来存储长期存活的对象。通常,为年轻代对象设置一个阈值,当满足这个年龄时,对象移动到老年代。最终,老年代需要被收集。这个事件被称为主要的垃圾收集。

主要的垃圾收集也停止了领域事件。通常一个主要的收集要慢得多,因为它涉及到所有存活的对象。因此,对于响应性应用程序,应该尽量减少主要的垃圾收集。还需要注意的是,停止主要的垃圾收集的领域事件的长度会受到老年代空间的垃圾收集器的影响。

持久代包含JVM需要的元数据,来描述应用程序中使用的类和方法。永久代在运行时有JVM在应用程序使用的类的基础上填入。此外,JAVA SE库的类和方法可能存储在这里。

如果JVM发现他们不再需要,并且可能其他类需要空间,那么类可能会被收集(卸载)。永久代包含在一个完整的垃圾收集中。

 

本章节结束,核心章节会持续更新。本文如有错误或不足之处,希望各位看官不吝赐教。

第四章链接:Java垃圾回收(GC)系列四 分代垃圾收集过程

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值