java GC工作机制
转自:http://www.cnblogs.com/hzdtf/articles/5419987.html
GC:垃圾回收站,是将java的无用的堆对象进行清理,释放内存,以免发生内存泄露。在介绍java回收站前,首先介绍下几种回收机制
1. 引用计数:
当一个对象A被其他对象B引用时,对象A引用+1,断开引用则-1,GC工作时,会检查所有对象中的引用计数,如果为0则代表要清除,>0则表示有其他对象引用不能清除。这种机制有一个致命缺点,就是当两个对象互引用时,在遍历时可能会发生这两个对象引数永远不为0,则永远不会被删除。此机制java从不使用。
2. 停止-复制:
程序暂停运行,启动GC,GC从堆或静态存储区开始遍历所有对象,判断对象是否“活”的对象,如果是活不删除,反之删除。判断是否“活”就是判断该对象是否有被其他对象引用,从链上去查找。当是活对象时,GC会从另外堆里开避一个大空间,然后将活对象复制一份到新空间里,在复制时按着紧密排列,同时更新所有引用地址为新的地址,不活对象原封不动。遍历完后,再遍历一次,这次是将不活的对象彻底给删除。
优点:所有对象能够重新紧密排列,不会出现内存碎片,这对以后创建对象能提供更快的效率。
缺点:占用的内存空间大,要原对象的2倍空间;这种模式无论如何所有活的对象都要复制一份,假设遍历到最后,对象很稳定,只出现少量垃圾对象或者根本没垃圾对象,这时已经做了复制工作,浪费了资源。
3. 标记-删除:
程序暂停运行,启动GC,GC从堆或静态存储区开始遍历所有对象,判断对象是否“活”的对象,如果是活不删除,反之删除。判断是否“活”就是判断该对象是否有被其他对象引用,从链上去查找。当是活对象时,会给对象给个标记符号,死对象则不标记,遍历完后,第二次遍历时,只保留标记的对象,把所有没标记的对象都删除。
以上第2和第3种都是要遍历两次,而且都是最后一次才执行真正删除,比起第1种来说要慢很多,因为要遍历2次,尤其是第2种,还要复制动作,但这2种归避了第1种的致命缺点。
早期的jvm采用的是标记-删除模式,继java5后,jvm采用自适应技术,就是根据自身状态情况,在”停止-复制“和”标记-删除“自动切换以达到最快效率。在第1遍历时,如果确定对象需要回收,则会先执行对象的finalize()方法。
java GC具体工作原理:
JVM分配内存是以较大的块为单位,如果对象为较大,则该对象本身为一个块。GC先启动“停止-复制”模式,遍历对象时,遇到活对象,则把对象复制到新块里,同时块代数+1,如果对象较大,则保持不动,代数+1;如果检测到垃圾对象稀少,则自动切换到“标记-删除”模式,如果检测到对象分布到内存太零散,则又会自动切换到“停止-复制”模式来重新整理内存紧密分布。这就是自适应技术。
JVM分配内存时,有一个堆指针,堆指针指向当前最后一个被分配的内存块,由于“停止-复制”模式,对象大部分都是连续排列的,则堆指针移动下一格,就是尚未分配的内存,这时就不用在整个堆空间里查找未分配的内存了,这对创建速度有很大提高。
关于对象的finalize()方法:
finalize方法是指对象完成时执行的一些清理工作,是Object里的受保护方法,在外界不能调用。实质上这个方法是给GC调用的,什么时候调用以上有讲。此方法是强调进一步对象需要释放非托管对象,是一个检测保险的作用,比如一个类里包含访问一个流内容,如下:
class AccessStream
{
private InputStream stream;
private boolean isClose = false;
/* (non-Javadoc)
* @see java.lang.Object#finalize()
*/
@Override
protected void finalize() throws Throwable
{
if (!isClose)
{
stream.close();
}
super.finalize();
}
}
此类在操作流完后,正确作法是,应该即时关闭流(调用close());有时因为程序员某些租心大意原因,并没及时关闭流,这时重写finalize() 作最后保险作用,当没有关闭时,释放此对象前关闭流。
通常不建议重写finalize,除了要求程序员严格习惯,最重要的是finalize并不能马上执行,即使是显式调用System.gc() 也不保证立刻执行,只能说建议GC执行,GC是否要执行,要看当前内存占用量等因素。如果finalize不能马上执行,这就意味着本来应该早点释放流,而出现很长时间才释放。
java GC工作机制的更多相关文章
- Java GC回收机制
优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...
- JVM结构、GC工作机制详解
JVM结构.内存分配.垃圾回收算法.垃圾收集器.下面我们一一来看. 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分 ...
- JVM结构、GC工作机制详解(转)
原文地址:http://blog.csdn.NET/tonytfjing/article/details/44278233 JVM结构.内存分配.垃圾回收算法.垃圾收集器.下面我们一一来看. 一.JV ...
- 了解一下JVM和GC工作机制
题外话:很久没有写博客了,事情颇多,今天空闲下来,学习一下顺便写一下自己的了解,机会总是留给有准备的人,所以平常一定要注意知识的巩固和积累.知识的深度也要有一定的理解,不比别人知道的多,公司干嘛选你? ...
- 【转载】JVM结构、GC工作机制详解
文章主要分为以下四个部分 JVM结构.内存分配.垃圾回收算法.垃圾收集器.下面我们一一来看. 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知, ...
- Java IO工作机制分析
Java的IO类都在java.io包下,这些类大致可分为以下4种: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 ...
- java GC 回收机制 转
JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...
- Java GC工作原理以及Minor GC、Major GC、Full GC简单总结
名词解释: GC:垃圾收集器 Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非 ...
- Java NIO工作机制简介
前言 本博客只简单介绍NIO的原理实现和基本工作流程 I/O和NIO的本质区别 NIO将填充和提取缓冲区的I/O操作转移到了操作系统 I/O 以流的方式处理数据,而 NIO 以缓冲区的方式处理数据:I ...
随机推荐
- 有趣的 Mysql 存储引擎
Mysql 提供了一套统一的应用开发模型和核心 API,因此,尽管不同的存储引擎拥有不同的特性,不过对于开发人员,应用操作都是完全透明的.应用层的连接并不直接访问存储引擎层,而是访问 Mysql 提供 ...
- Web下的整体测试 --性能测试及优化思路
随着Internet的日益普及,现在基于B/S结构的大型应用越来越多,可如何对这些应用进行测试成为日益迫切的问题.有许多测试人员来信问我B/S的测试如何做,由于工作较繁忙,对大家提出的问题也是头痛医头 ...
- msysgit使用方法
安装好后运行"Git Bash",出现命令框. 输入 ssh-keygen -t rsa -C “your_email@youremail.com” 会提示SSH Public K ...
- selenium测试(Java)--截图(十九)
package com.test.screenshot; import java.io.File; import java.io.IOException; import org.apache.comm ...
- Spring Boot 官方文档学习(一)入门及使用
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
- oracle中如何把结果集插入临时表中
比如临时表叫temp,你要查询的语句为select * from 表名 where id=1. 1.建表temp 2.插入语句: ; commit;
- Go 内嵌静态资源
http://fuxiaohei.me/2016/10/1/go-binary-embed-asset.html
- kendo-ui的使用和开发自己的组件
摘要: 前面介绍了一款非常不错的前端框架kendo-ui,如果你想阅读,请点这里.通过使用它一段时间,感觉是非常好用.下面就介绍一下如何使用它和开发自己的组件 引入: 只需要引进下面三个文件即可 ke ...
- Java精选笔记_IO流(字节流、InputStream、OutputStream、字节文件、缓冲区输入输出流)
字节流 操作图片数据就要用到字节流. 字符流使用的是字符数组char[],字节流使用的是字节数组byte[]. 字节流读写文件 针对文件的读写,JDK专门提供了两个类,分别是FileInputStre ...
- Cesium - 离线使用方法
使用Cesium可以直观的看基于DEM切片产生的Terrain地形数据,有种身临其境的感觉,但缺点是Cesium默认缺省加载了微软Bing提供的地形以及遥感影像数据,可以跟踪日志,总提示让你申请微软的 ...