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 ...
随机推荐
- print spooler 服务无法启动 打印机全部消失
这往往是失败的打印任务导致的. 打开 C:\Windows\System32\spool\PRINTERS ,这个目录下的文件全是打印缓存,失败的任务也保存在这里.把这里的文件全部删除,然后再重新启动 ...
- js对数字的校验
//-----------------------------------------------函数(1):允许输入正数和负数的表达式-------------------------------- ...
- Python python的输入输出
#-*- coding:utf-8 -*- #屏蔽中文乱码方案一(官方推荐) #这个语句必须顶行写 #屏蔽中文乱码方案二(不建议使用) '''#coding=utf-8 ''' #input(),输入 ...
- 【F12】修改 DevTools的主题
1.点击setting
- : error C3861: “Sleep”: 找不到标识符
编译的时候:error C3861: “sleep”: 找不到标识符,是什么原因啊?编译的时候:error C3861: “sleep”: 找不到标识符,是什么原因啊?哪位好心的哥哥告诉我吧,分全是你 ...
- linux -- Ubuntuserver图形界面下安装、配置lampp、phpmyadmin
PHP开发和服务器运行环境首选LAMP组合,即Linux+Apache+Mysql+Php/Perl/Python,能最优化服务器性能.如何在本地电脑Ubuntu 中安装和配置LAMP环境搭建?Ubu ...
- 【c语言】推断一个数是奇偶数
// 推断一个数是奇偶数 #include <stdio.h> void judge_sd(int a) { if ((a & 1) == 0) { printf("是偶 ...
- MetaSploit Pro 下载地址
Windows: https://downloads.metasploit.com/data/releases/metasploit-latest-windows-installer.exe Linu ...
- js省市二级联动
html: <script src="js/city.js"></script> ...... <body> <div class=&qu ...
- Oracle行列转换的思考与总结
最近几天一直在弄Oracle-SQL的问题,涉及到了一些平时没有用到的东西,也因此而在这里郁闷了好久.现在问题得到了解决虽说不算完美.但是还是和大家一起分享一下. 行列转换之一:sum(case wh ...