自动垃圾回收( 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. linux (ubuntu) 下设置 tomcat 随系统自动启动

    网上说的有很多, 我只记录一种 1. 切换到 /etc/init.d/ 目录下 2. sudo vim tomcat 3. 在打开的文件里写入以下内容 #!/bin/sh # chkconfig: # ...

  2. CDOJ 92 – Journey 【LCA】

    [题意]给出一棵树,有n个点(2≤N≤105),每条边有权值,现在打算新修一条路径,给出新路径u的起点v,终点和权值,下面给出Q(1≤Q≤105)个询问(a,b)问如果都按照最短路径走,从a到b节省了 ...

  3. 关于java中Double类型的运算精度问题(转)

    Java Java double:浮点数:精确计算  public class Test{    public static void main(String args[]){        Syst ...

  4. 《InsideUE4》UObject(三)类型系统设定和结构

    垃圾分类,从我做起! 引言 上篇我们谈到了为何设计一个Object系统要从类型系统开始做起,并探讨了C#的实现,以及C++中各种方案的对比,最后得到的结论是UE采用UHT的方式搜集并生成反射所需代码. ...

  5. POJ 1155 树形背包(DP) TELE

    题目链接:  POJ 1155 TELE 分析:  用dp[i][j]表示在结点i下最j个用户公司的收益, 做为背包处理.        dp[cnt][i+j] = max( dp[cnt][i+j ...

  6. URL编码详解

    escape,encodeURI,encodeURIComponent. 据说还有base64,但会被 = 来补. 待编辑.

  7. Android学习----打印日志Log

    Log.v(tag,msg);所有内容 Log.d(tag,msg);debug Log.i(tag,msg);一般信息 Log.w(tag,msg);警告信息 Log.e(tag,msg);错误信息 ...

  8. SQL SAVE TRANSACTION

    --创建存储过程 create procedure qiantaoProc @asd nchar(10) as begin begin try begin transaction innerTrans ...

  9. 数据结构 --- 线性表学习(php模拟)

    线性表:零个或多个数据元素的有限序列(注:以下都是用的整型数据模拟) 一 顺序存储结构(用一段地址连续的存储单元一次存储线性表的数据元素) 1.1 三个属性:存储空间的起始位置:最大存储容量:当前长度 ...

  10. Smarty 模板引擎 fetch()和display()函数的区别?

    Smarty模板函数里面有这样一个方法:fetch("template.htm"),他和display("template.htm");最大的不同就是fetch ...