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 ...
随机推荐
- 利用百度地图API根据地址查询经纬度
传上来只是为了记录下三种jsonp方式,$.get(url, callback)方式不行,会出错 -- 必须指明返回类型为”json”才行. 或者使用$.getJSON()或者$.ajax({}). ...
- 第三百一十四节,Django框架,自定义分页
第三百一十四节,Django框架,自定义分页 自定义分页模块 #!/usr/bin/env python #coding:utf-8 from django.utils.safestring impo ...
- erlang的catch和 try catch的初步猜测
一. catch(Fun):似乎可以避免因为 函数Fun内的错误而造成的当前的进程的崩溃.
- socket小实例
服务端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- C#操作MSMQ(消息队列)
using System; using System.Collections.Generic; using System.Text; using System.Messaging; using Sys ...
- Java精选笔记_XML基础
XML基础 XML概述 W3C组织简介 W3C是World Wide Web Consortium(万维网联盟)的缩写,它是对网络标准定制的一个非赢利组织,如HTML.XHTML.CSS.XML的标准 ...
- Java类的设计----Object 类
Object类 Object类是所有Java类的根父类如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类 public class Person { ... } 等价于: ...
- python2.0_s12_day11_SqlAlchemy使用介绍
SqlAlchemy ORM ORM的解释; 简单点:对象关系映射. 需求:我们写一个主机管理,把主机信息存在数据库,一开始我们编程不熟练的时候,执行命令时候要调用数据库,会把相应的SQL语句写到代码 ...
- eclipse、tomca和jvm的相关内存配置
1, 设置Eclipse内存使用情况 修改eclipse根目录下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m ...
- java集合的中的集合关系实现或继承关系图
放在这儿一目了然.