今天看thinking in java,里面很详细的谈到java垃圾回收器机制,看完后让我对这神秘的区域有一定的了解,特写一些小总结记录下来。

  分两点来说。

  第一点:Object.finalize();方法。finalize()方法是Object类的意味着所有类都可以使用、重写该方法。当对象调用finalize方法后,相当于告诉垃圾回收器:“我是垃圾,在下次垃圾回收的时候可以把我回收”,然后垃圾回收器在下次回收垃圾的时候就把这个对象给回收了,但是在程序运行周期中,垃圾回收器不一定会执行,它一般在虚拟机内存不够的时候才会执行,为什么是这样呢?因为垃圾回收器的执行也消耗资源、性能,而且在程序结束的时候,虚拟机的内存会自动释放归还给内存。当然你也可以显示地调用System.gc();来告诉系统立刻、马上进行垃圾回收,但是不建议这么做,虚拟机总是在最优的时刻调用垃圾回收。很多经验丰富的开发者同时建议:如果不是必须,最好不要使用finalize()。

  第二点:垃圾回收。垃圾回收这个动作实际上做了两件事,1、回收垃圾,释放内存;2、重新排列堆中内容,让内存的分配更高效。

  在程序启动后,java虚拟机在不断地监视着内存情况,如果发现垃圾比较多,对象在堆中排布比较零散,启动第一种模式:停止-复制(stop and copy)。先把“活”的对象找出来,怎样找呢?垃圾回收器检索整个堆,因为引用可能不断关联着引用,所以将堆中的引用整理出一个“脉络图”,没有被引用的就是“死”的对象,接着,程序短时间停止,把“活”的对象从堆A复制到堆B中,一个挨一个排列整齐,现在堆A只剩下“死”的对象了,也就是垃圾,回头把堆A全部清理,这样就完成一次垃圾清理了。

  假设有9个碎片化严重的对象,排布前和排布后对比:

  

  有人可能想到,如果垃圾比较少,对象比较稳定的情况,那么要把所有“活”的对象迁移到另一个堆里,不是很耗费性能吗?就好比一座稳定的大山需要搬迁,工程浩大。对于这种情况,启动第二种模式:标记-清除(mark and clear),同样如上方法整理出“脉络图”,把“死”的对象标记起来,程序短时间暂停,然后垃圾回收器把标记的对象给回收。因为垃圾较少,不会造成内存碎片化太严重,所以这个模式不会对堆中对象重新排布。

浅谈java垃圾回收机制的更多相关文章

  1. 浅谈python垃圾回收机制

    引入 ​ 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那 ...

  2. 浅谈 JavaScript 垃圾回收机制

    github 获取更多资源 https://github.com/ChenMingK/WebKnowledges-Notes 在线阅读:https://www.kancloud.cn/chenmk/w ...

  3. 浅谈c#垃圾回收机制(GC)

    写了一个window服务,循环更新sqlite记录,内存一点点稳步增长.三天后,内存溢出.于是,我从自己的代码入手,查找到底哪儿占用内存释放不掉,最终明确是调用servicestack.ormlite ...

  4. 【转载】Java垃圾回收机制

    原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...

  5. 【转】深入理解 Java 垃圾回收机制

    深入理解 Java 垃圾回收机制   一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  6. 深入理解java垃圾回收机制

    深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  7. Java垃圾回收机制_(转载)

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

  8. 成为Java GC专家(3)—如何优化Java垃圾回收机制

    为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...

  9. java 垃圾回收机制 引用类型

    Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...

随机推荐

  1. Windows安全事件日志中的事件编号与描述

    帐号登录事件(事件编号与描述) 672 身份验证服务(AS)票证得到成功发行与验证.673 票证授权服务(TGS)票证得到授权.TGS是一份由Kerberos 5.0版票证授权服务(TGS)发行.且允 ...

  2. 解决IIS7 HTTP/405 Method Not Allowed 问题的方法.

    1.处理程序映射 2.添加脚本映射 3.请求路径:*.html 4.可执行文件:C:/windows/system32/inetsrv/asp.dll 5.请求限制-谓词:输入需要允许请求的谓词(po ...

  3. SQL Server 数据库定时自动备份

    原文:SQL Server 数据库定时自动备份 SQL Server 数据库定时自动备份——每天定时备份,保留前8天的备份 利用SQL Server代理新建作业来定期备份 1)在数据库库的[SQL S ...

  4. 2014由于在myeclipse5.5.1许可证

    点击假设Myeclipse负载项目server该图标不响应.这是MyEclipse过期,这也是一年许可: subscriber: axin  Serial:nLR8ZC-855575-69517252 ...

  5. knockout笔记

    根据汤姆大叔博客总结-笔记: =============<script type="text/javascript"> $(function () { var View ...

  6. 一步一步实现基于Task的Promise库(四)无参数的WorkItem

    接着上一篇我直接给出代码,现在支持了new Task(), then(), all(), any() 这些不传参的调用方式. (function(){ var isFunction = functio ...

  7. mvc3项目如何在IIS7.5上发布的

    若项目拿到服务器上发布,必须要安装MVC3的安装包! 1.在vs中打开你要发布的项目,右键属性找到发布 2.弹出发布web对话框,选择<新建配置文件...> 在弹出的对话框中输入一个配置文 ...

  8. Step one : 熟悉HTML

    //H1 1 <html> <head> <title>BeiJing</title> </head> <body> <h ...

  9. 只有五行的Floyd最短路算法

            暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.         上图中有 ...

  10. Mac OS X安装之虚拟机环境下的总结

    最近一直忙着公司iOS Touch的新版发布,终于忙过了.现在,又开始了新的阶段,不过算是轻松了很多.回来一看,自己的博客空空如也,实在受不了了.于是,开始更一下吧,哈哈. 这个文档是我几个月前,开始 ...