Java垃圾回收机制

垃圾回收机制用到finalize。当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存就会变成垃圾,等待垃圾回收机制进行回收。

垃圾回收机制特征:

垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如:数据库连接,网络IO)

程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候运行。当对象永久的失去引用后,系统就会在合适的时候回收它所占的内存。

垃圾回收机制回收任何对象之前,总会调用它的finalize()方法,该方法可能使对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收

对象在内存中的状态:

当一个对象在堆内存中运行时,根据它被引用变量所引用的状态,可以把它所处的状态分为以下三种:

可达状态:

当一个对象被创建之后,有一个及以上的引用变量去引用它,则这个对象在程序中处于可达状态,程序可通过引用变量来调用该对象的Field和方法。

可恢复状态:

如果程序中某个对象不再有引用变量引用它,它进入了可恢复状态。在这种状态下,系统的垃圾回收机制准备回收该对象所占的内存,在回收该对象前,系统会调用所有可恢复状态对象的finalize()方法进行资源清理,如果系统在调用finalize()方法时重新让一个引用变量引用该对象,则这个对象会再次变成可达状态;否则该对象进入不可达状态。

不可达状态:

当对象与所有引用变量的关联都被切断,且系统已经调用所有对象的finalize()方法后依然没有使该对象变成可达状态,那么这个对象将永久地失去引用,最后变成不可达状态。只有当一个对象处于不可达状态时,系统才会真正的回收该对象所占的资源。

强制垃圾回收

当一个对象失去引用后,系统何时调用它的finalize()方法对它进行资源清理,何时它会变成不可达状态,系统何时回收它所占有的内存。对于系统程序完全透明。程序只能控制一个对象任何不再被任何引用变量引用,绝不能控制它何时被回收。

强制只是建议系统立即进行垃圾回收,系统完全有可能并不立即进行垃圾回收,垃圾回收机制也不会对程序的建议置之不理:垃圾回收机制会在收到通知后,尽快进行垃圾回收。

强制垃圾回收的两个方法:

调用System类的gc()静态方法:System.gc()

调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc()

finalize方法

在垃圾回收机制的回收某个对象所占的内存之前,通常要求程序调用适当的方法来清理资源,在没有明确指明清理资源的情况下,Java提供了默认机制来清理该对象的资源,这个机制就是finalize()方法。

当finalize()方法返回后,对象消失,垃圾回收机制开始执行。

finalize()方法具有以下四个特点:

永远不要主动调用某个对象的finalize()方法,该方法应交给垃圾回收机制调用。

finalize()方法何时被调用,是否被调用具有不确定性,不要把finalize()方法当成一个会被执行的方法。

当JVM执行可恢复对象的finalize()方法时,可能使该对象或系统中的其他对象重新变成可达状态。

当JVM执行finalize()方法时出现异常,垃圾回收机制不会报告异常,程序继续执行

java 强制垃圾回收_Java垃圾回收机制相关推荐

  1. java list clear 垃圾回收_java垃圾回收机制

    1.什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导数内存溢出,所以内存资源的管是非常重要了. 1.1.C/C++语言的垃圾回收 在C/C+ ...

  2. java 静态数组 垃圾回收_java垃圾回收

    参考文献: 1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象.该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引 ...

  3. java 内存 回收_java内存回收

    一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二. ...

  4. java强制转换用法_Java入门课|这才是Java强制类型转换的正确使用方法,你真的会用这些吗...

    [摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...

  5. java如何保证类不被回收_Java垃圾回收机制

    大部分转自:http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用, ...

  6. java垃圾回收_Java垃圾回收机制

    垃圾回收的意义 如果不进行垃圾回收,内存迟早会被消耗空. 垃圾回收机制的引入可以有效的防止内存泄露.保证内存的有效使用,也减轻了 Java 程序员的对内存管理的工作量. 内存泄露:指该内存空间使用完毕 ...

  7. java 老年代回收_Java垃圾回收之老年代垃圾收集器

    1.Serial Old 收集器(-XX: +UseSerialOldGC, 标记-整理算法) 1.1 单线程收集,进行垃圾收集时,必须暂停所有工作线程 1.2 简单高效,Client模式下默认的老年 ...

  8. java 垃圾回收手动回收_Java垃圾回收(2)

    java 垃圾回收手动回收 并行清理 今天,我们介绍了并行GC的工作原理. 具体来说,这是在Eden上运行并行Scavenge收集器,在Tenured一代上运行Parallel Mark and Sw ...

  9. java 垃圾回收手动回收_Java垃圾回收(4)

    java 垃圾回收手动回收 G1:垃圾优先 G1收集器是热点JVM中要实现的最新收集器. 自Java 7 Update 4以来,它一直是受支持的收集器.OracleGC团队也公开表示,他们对低暂停GC ...

最新文章

  1. [转]实战 SQL Server 2008 数据库误删除数据的恢复
  2. 关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
  3. vscode 全项目替换_利用vscode插件提升前端国际化开发效率
  4. 宽带拨号时出现错误列表
  5. 认识 lib 目录里的 .so 文件
  6. spring mvc传值html页面,spring mvc向前台页面传值-ModelAndView
  7. python语言的取余运算符_Python 中用于整数除法取余的运算符是()_学小易找答案...
  8. 自学python(一)
  9. html制作任务计划列表网页,添加计划任务的脚本
  10. 这边本来有1个人,现在没了:你有没有想过有一天自己也会被取代
  11. python3 compile_python3.2的pycompile
  12. [CodeForces332E]Binary Key
  13. tensorflow reduce系列函数(tf.reduce_mean, tf.reduce_sum, tf.reduce_prod, tf.reduce_max, tf.reduce_min)
  14. php api 在线编辑导出,api在线管理,调试,文档生成工具之Apizza
  15. 编写QT代码实现与FlightGear通信
  16. 计算机本地连接无internet访问权限,ipv4连接无internet访问权限怎么解决
  17. 亲爱的朋友,您幸福吗?
  18. 淘宝秒杀半价前N名半价商品
  19. 数字后端——信号完整性分析
  20. 风控概要和内容安全,反欺诈(营销风控)

热门文章

  1. JPA入门到精通 - JPA入门
  2. 微信公众号开发小记——4.两种邀请用户的方式 扫码链接
  3. 先记录一下吧 开始的程序 hello!java!
  4. mysql之日志和mysqlbinlog工具的使用
  5. Android技术经理+资深工程师+研发工程师-杭州
  6. 附庸风雅(2006-10-20 13:39:32)(新浪)
  7. 浏览器缓存详解:expires,cache-control,last-modified,etag详细说明
  8. datanode 不能连接master
  9. js-jQuery对象与dom对象相互转换
  10. post和get提交中文数据的转码问题