Java中的finalize()方法

原创 2017年07月04日 22:15:12

Java中的finalize()方法

Java中假定finalize的工作原理为:一旦垃圾回收器准备回收内存而释放对象所占内存的时候,会先调用该对象的finalize方法,然后在下一次再需要垃圾回收的时候才真正的回收对象!

finalize()的作用:finalize用于在GC发生前事先调用去回收JNI调用中申请的特殊内存,下次GC发生时候保证GC后所有该对象的内存都释放了。


垃圾回收

  • -Java的垃圾回收器只会释放由我们new出来的内存堆块,那些不是由new出来的“特殊内存”,垃圾回收器是不会管理的。
  • -所谓的特殊内存指通过JNI用C/C++向系统申请的内存,这些内存如果不手动去清除就会一直占据在内存中。
  • -而且,垃圾回收本身就有开销,所以虚拟机不会经常GC,只有当内存快要耗尽的时候JVM才会触发GC。

finalize()

  • -由上,Java中的对象并不一定会被全部垃圾回收,当你不想要该对象的时候,你需要手动去处理那些“特殊内存”,java中没有析构,所以提供了一个finalize()方法让我们来执行清理工作。
  • -当系统进行GC的时候会先调用finalize方法,然后再下次才会回收对象的内存。因为native中申请的内存,GC没有办法回收所以finalize被用来做垃圾回前的重要清理工作:释放特殊内存。
  • -所以finalize一般使用在使用了JNI的情景下,需要在finalize中调用native方法释放特殊内存,一般情况下不要使用finalize!
  • -如果GC不发生那么finalize也不会发生,finalize是Object的protect方法,不可以在类族外访问。

不是析构函数

  • -Java因为有GC机制,所以没有析构函数的概念!
  • -finalize不是C++中的析构函数:析构函数肯定是会销毁该对象的,但是finalize因为gc机制不会经常发生,所以其被执行的是不确定的。(不知道是不是我没理解透,没觉得这两个有什么可比性,一个主动发生一个被动发生)

其他

  • -调用System.gc(),可以强制让gc发生来触发finalize方法!但是GC也只是GC垃圾的对象(没有被引用的),非垃圾的对象的finalize不会被调用。程序终止和GC不是一个概念。
  • -正常情况下你调用finalize()都是直接super.finalize()使用父类的就行了。
  • -finalize一般不用!被执行的不确定性太大。不要指望使用finalize来回收你的对象,它只会在系统进行GC的时候清理特殊内存,不受你的控制!

裸板调试方法合集

我们用的比较多的(点灯串口打印)
  • 2017年01月12日 14:55

java中finalize()方法

1、对象的finalize()方法简介 当垃圾回收器将要释放无用对象的内存时,先调用该对象的finalize()方法。如果在程序终止之前垃圾回收器始终没有执行垃圾回收操作,那么垃圾回收器将始...
  • wenwenxiong
  • wenwenxiong
  • 2015-04-30 18:46:09
  • 2836

java垃圾回收机制和finalize()方法

一、java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。        (1).对象不一定会被回收。        (2).垃圾回收不是析构函...
  • lurao
  • lurao
  • 2016-04-23 11:43:16
  • 2129

为什么在Java中不使用finalize()方法

我们都知道finalize()方法是回收分配给对象的内存之前调用垃圾收集器线程的基本语句。在这篇文章中,我们将会深入这个方法。 这篇文章中的章节: 1、finalize()方法不能保证执行(这个将...
  • maoyeqiu
  • maoyeqiu
  • 2015-11-01 22:25:21
  • 3787

慎用Finalize方法以及Finalize方法的妙用

首先,要知道finalize方法跟c++的析构函数不一样,jvm并不保证会执行。 一、慎用finalize方法 finalize方法在什么时候被调用: 在垃圾回收的时候,某个对象要被回收的时候,会...
  • q291611265
  • q291611265
  • 2015-07-29 20:14:18
  • 2975

Java中的finalize方法理解

首先:system.gc()并不是你调用就马上执行的, 而是根据虚拟机的各种算法来来计算出执行垃圾回收的时间,另外,程序自动结束时不会执行垃圾回收的。 其次:对象被回收时,要经过两次标记,第一次标记...
  • q35445762
  • q35445762
  • 2015-07-16 23:18:10
  • 1400

java中finalize终结方法的一些问题

一、finalize的作用        由于在java中存在垃圾回收器,因此许多人认为它相当于C++中的析构函数,然而,垃圾回收器只会回收使用new方法获得的内存,而通过其他方法得到的内存以及任何...
  • YJian2008
  • YJian2008
  • 2013-12-03 11:16:10
  • 1675

finalize()方法调用的时机

【示例一】 package com.jjyy.basic; /** * finalize方法会在什么时间执行? * * @author jiangyu 2015年9月9日 * */ pub...
  • Before_Morning
  • Before_Morning
  • 2015-09-09 09:41:08
  • 1348

java中gc()何时调用finalize()方法

有人会说:这个简单,直接调用System.gc()或者Runtime.getRuntime().gc();就可以了 。那我想说System.gc()到底什么时候调用finalize()呢?下面的列子...
  • u012675436
  • u012675436
  • 2013-11-07 10:22:11
  • 1648

在finalize方法中复活java对象

/** * 该类用于演示在对象的finalize()方法中复活对象(来自《实战java虚拟机》-葛一鸣) * 2017年4月4日 下午9:06:00 * @version v1.0 */ pu...
  • nmgrd
  • nmgrd
  • 2017-04-04 21:09:34
  • 695
收藏助手
不良信息举报
您举报文章:Java中的finalize()方法
举报原因:
原因补充:

(最多只允许输入30个字)