[Java] 垃圾回收机制 ( Garbage Collection ) 简介
自动垃圾回收( 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 ) 简介的更多相关文章
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
- 细述 Java垃圾回收机制→Types of Java Garbage Collectors
细述 Java垃圾回收机制→Types of Java Garbage Collectors 转自:https://segmentfault.com/a/1190000006214497 本文非原创, ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- Java垃圾回收机制_(转载)
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- java 垃圾回收机制 引用类型
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...
- 【Java】Java垃圾回收机制
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- Java垃圾回收机制(GC策略)
Java垃圾回收机制(GC策略) 核心:1,哪些是垃圾?[怎么确定这个是垃圾]:2,如何回收垃圾?[怎么更好收垃圾]. Java语言相对于C++等语言有一个自动垃圾回收机制,只用管使用[实例化对象], ...
- java垃圾回收机制学习总结
最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...
- Java垃圾回收机制(转)
原文链接:Java垃圾回收机制 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内 ...
随机推荐
- JavaScript--DOM增删改操作
JavaScript使用DOM操作节点来进行增删改操作 <!DOCTYPE html> <html> <head> <meta charset="U ...
- js求字符长度
</script> <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- My.Ioc 代码示例——谈一谈如何实现装饰器模式,兼谈如何扩展 My.Ioc
装饰器模式体现了一种“组合优于继承”的思想.当我们要动态为对象增加新功能时,装饰器模式往往是我们的好帮手. 很多后期出现的 Ioc 容器都为装饰器模式提供了支持,比如说 Autofac.在 My.Io ...
- C# - 二叉树表达式计算
很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...
- (转)PHP中extract()函数的妙用
近日在看一个牛人的代码时,看到一个非常好用的函数:extract(),它的主要作用是将数组展开,键名作为变量名,元素值为变量值,可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取$_ ...
- SVN设置钩子文件限制提交文件时必须填写更新日志
进入相应SVN仓库hooks目录,编辑文件pre-commit #!/bin/sh # PRE-COMMIT HOOK## The pre-commit hook is invoked before ...
- SQL利用临时表实现动态列、动态添加列
--方法一--------------------------------------------------------------------- declare @sql as varchar(1 ...
- jrae源码解析(一)
jare用java实现了论文<Semi-Supervised Recursive Autoencoders for Predicting Sentiment Distributions>中 ...
- 【转】iOS开发系列--数据存取
原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...
- AFNetworking使用详解
导语: 众所周知,AFNetworking是目前IOS开发中非常受欢迎的第三方网络通信类库,同时AFNetworking对苹果官方NSURLConnection和NSURLSession进行了封装,使 ...