自动垃圾回收( 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. 微信小程序开发工具(0.9.092300)下载地址,分享给没有公众号的小伙伴

    目前最新的v0.9.092300,不需要填AppID就能直接开发,也不需要破解了. OSX版本.WIN64.WIN32下载地址: http://pan.baidu.com/s/1qXOdkgG

  2. POJ 1039 Pipe 枚举线段相交

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9493   Accepted: 2877 Description ...

  3. Android开发--WIFI实现

    wifi的基本结构 在Android的官方文档中定义了如下五种状态: WIFI_STATE_DISABLING  WIFI网卡正在关闭  0 WIFI_STATE_DISABLED   WIFI网卡不 ...

  4. html.day01

    1.web标准: 1. 结构  (xhtml)  2. 表现(css)  3.行为(js) html   超文本标记语言 xhtml  (严格型超文本标记语言) 2.规范: 1. 所有标签(标记)都要 ...

  5. datazen logo修改

    第一步:进入cp 页面 第二步: P161说明文档的P161开始,这里有说有版本的图片命名 第三步:再次强调第二步的命名,否则 如果你直接复制这个名字,不但效果出不来,还删除不掉这个包,我上次是把da ...

  6. 五、C# 类

    面向对象编程 类是面向对象编程的3个主要特征---封装.继承和多态性---的基础.   封装允许隐藏细节.   继承 继承关系至少涉及两个类,其中一个类(基类)是另一个类的更泛化的版本.   为了从一 ...

  7. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第三章:搜索、高级过滤和视图模型

    在这一章中,我们首先添加一个搜索产品的模块以增强站点的功能,然后使用视图模型而不是ViewBag向视图传递复杂数据. 注意:如果你想按照本章的代码编写示例,你必须完成第二章或者直接从www.apres ...

  8. 【USACO 3.2.3】纺车的轮子

    [描述] 一架纺车有五个纺轮,这五个不透明的轮子边缘上都有一些缺口.这些缺口必须被迅速而准确地排列好.每个轮子都有一个起始标记(在0度),这样所有的轮子都可以在统一的已知位置开始转动.轮子按照角度变大 ...

  9. Build Android-x86 ICS 4 Virtualbox from Google Virtualbox Target and Intel Kernel 编译体验

    最近一直在研究android源码的编译,应该说研究的很辛苦,最难的是下源码,总是不停的断掉,最后感谢公司的高网速,找到方法后12G的源码只花了1个小时就下完了. 参考以下网址:http://softw ...

  10. shell每日发邮件

    LOGFILE="$fank/"`date +"%Y%m%d"`"data"#每日文件 from="abc@123.com&quo ...