自动垃圾回收( Automatic Garbage Collection )

自动垃圾回收,是指在堆(Heap)内存上分辨哪些对象还在被使用,哪些对象没有被使用,并清除没有被使用的对象。所以,这里的垃圾实际上是指,在内存中,无法再被使用没有存在的价值的但还占据内存空间的对象。

C 语言的内存分配、回收是需要手动完成的,但在 Java 中,回收内存是由垃圾回收器自动完成的。

垃圾回收分为两步骤:1.标记,2.删除。删除垃圾有两种情况,a. 常规删除,b. 带压缩的删除。

第 1 步. 标记 ( Marking )

标记是指垃圾回收器给内存块打上标签,哪些对象有被引用,哪些对象不再被引用

上面的标记前的内存块,下面是标记后的内存块。

被引用的内存是蓝色,没有被引用的是橙色。所有对象都是在标记时期被确定是否有被引用。如果一个系统中的所有对象都需要被扫描,将会很消耗时间。

第 2 步,常规删除

常规删除,会清除没有被引用的对象,保留还在被引用的对象,并指向被清除后的自由内存空间。

上图是常规删除后的情况。

内存分配器持有自由空间的引用,当需要 new 新的对象是,则从自由空间中分配内存。

第 2a 步,带压缩的删除

为了提高性能,除了删除不被引用的对象之外,还可以压缩剩余的还被引用的对象的空间。通过移动剩余的对象,空出一整块的内存空间,方便后期的内存分配。

上图是带压缩删除后的情况。

内存分配器指向一整块空内存的开始位置,有需要的时候,按顺序分配内存即可。

JVM 世代 ( JVM Generations )

在前面有提到,标记并压缩 JVM 中所有的对象的效率是很低的。随着对象越来越多地被创建,垃圾回收的时间也会越来越长。根据经验,绝大多数的对象创建不久就会被抛弃,寿命很短。

上面是一个例子。

有图可见,随着时间的推移,仍然被引用的对象越来越少。大多数对象的生命周期都非常短。

根据上面的分析,可通过把堆分世代 ( Generations ) 的方法,来提升 JVM 的性能。堆内存被分为三大块:年轻代( Young Generation ),老年代 ( Old Generation ) ,永久代 ( Permanent Generation )

年轻代 ( Yong Gen ),是所有对象被创建,并变老的地方。当年轻代的空间被塞满时,会引起次垃圾回收 ( minor garbage collection )。次回收能起到优化作用,是基于对象的高死亡率假设。回收一个垃圾对象的年轻代是很快的。幸存下来的内存会变老,并会移到到老年代空间。

老年代 ( Old Gen ),用于存储幸存时间长的对象。通常,有一个阈值,当年轻代的对象的幸存的时间超过阈值,则会被移到老年代。到最后,老年代的存储也会被回收,这一过程称为主垃圾回收( major garbage collection )。

暂停全世界的事件 ( Stop the World Event ),次垃圾回收和主垃圾回收都属于暂停全世界的事件。暂停全世界的事件是指,应用的所有线程都会暂停,直到该事件完成。

通常,主回收会很慢,因为它涉及所有的对象。所以,对于高响应的应用,应当尽量避免主回收事件。JVM 提供了有多种类型的垃圾回收器。老年代的垃圾回收器的选择,会影响主回收引起的暂停全世界事件的时间长短。

永生代 ( Permanent Gen ),包含了 JVM 用到的,用于描述应用中类和方法的元数据( metadata )。在运行时,JVM 根据所用到的类,填充永生代空间的内容。Java SE 库中的类和方法也可能存于永生代。永生代对应的是类级别的内存。

当 JVM 发现一个类不在被使用,空间需要回收用于其他类是,该类的空间可能会回收。Full garbage collection 会覆盖到永生代的空间。

参考资料

Describing Garbage Collection, Java Garbage Collection Basics

[Java] 垃圾回收机制 ( Garbage Collection ) 简介的更多相关文章

  1. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

  2. 细述 Java垃圾回收机制→Types of Java Garbage Collectors

    细述 Java垃圾回收机制→Types of Java Garbage Collectors 转自:https://segmentfault.com/a/1190000006214497 本文非原创, ...

  3. 【转载】Java垃圾回收机制

    原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...

  4. Java垃圾回收机制_(转载)

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  5. java 垃圾回收机制 引用类型

    Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...

  6. 【Java】Java垃圾回收机制

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  7. Java垃圾回收机制(GC策略)

    Java垃圾回收机制(GC策略) 核心:1,哪些是垃圾?[怎么确定这个是垃圾]:2,如何回收垃圾?[怎么更好收垃圾]. Java语言相对于C++等语言有一个自动垃圾回收机制,只用管使用[实例化对象], ...

  8. java垃圾回收机制学习总结

    最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...

  9. Java垃圾回收机制(转)

    原文链接:Java垃圾回收机制 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内 ...

随机推荐

  1. iOS异步图片加载优化与常用开源库分析

    网络图片显示大体步骤: 1.下载图片: 2.图片处理(裁剪,边框等): 3.写入磁盘: 4.从磁盘读取数据到内核缓冲区: 5.从内核缓冲区复制到用户空间(内存级别拷贝): 6.解压缩为位图(耗cpu较 ...

  2. IOS 获取wifi的SSID

    #import <SystemConfiguration/CaptiveNetwork.h> - (NSString *)currentWifiSSID { // Does not wor ...

  3. RxJava RxAndroid【简介】

    资源 RxJava:https://github.com/ReactiveX/RxJava RxAndroid :https://github.com/ReactiveX/RxAndroid 官网:h ...

  4. Linq101-Conversion Operators

    using System; using System.Linq; namespace Linq101 { class Conversion { /// <summary> /// This ...

  5. Java 取整

    向上取整用Math.ceil(double a) 向下取整用Math.floor(double a) 举例: public static void main(String[] args) throws ...

  6. JavaScript 字符串

    字符串属性 属性 描述 constructor 返回创建字符串属性属性的函数 length 返回字符串的长度 prototype 允许您向对象添加属性和方法 字符串方法 Method 描述 charA ...

  7. thinkphp对文件的上传,删除,下载操作

    工作需要,整理一下最近对php的学习经验,希望能对自己有帮助或者能帮助那些需要帮助的人. thinkphp对文件的操作,相对来说比较简单,因为tp封装好了一个上传类Upload.class.php 废 ...

  8. C++ 实现网络爬虫

    吐槽 前天心血来潮, 把自己面试经历下了下来. 我觉得自己求职一路来比较心酸, 也付出了比一般人更多的汗水. 本以为写出来, 好歹可以作为一篇励志故事. 得到的评论却是, 语言只是一门工具. ||| ...

  9. 通过 Xshell 5 连接 centOS 7 服务器

    一. 在安装好了centOS 7 的服务上,打开终端 运行 ip -s addr 命令 获取服务的IP地址 [root@localhost ~]# ip -s addr1: lo: <LOOPB ...

  10. MLlib-分类与回归

    MLlib支持二分类,多酚类和回归分析的多种方法,具体如下: 问题类别 支持方法 二分类 线性支持向量机, 逻辑回归,决策树,朴素贝叶斯 多分类 决策树,朴素贝叶斯 回归 线性最小二乘,Lasso,r ...