finalize举个JAVA中finalize()例子 在线等快

finalize  时间:2021-07-16  阅读:()

gc()和finalize()有什么区别。。。

我们都知道Java垃圾回收器是负责回收无用对象占据的内存资源的,但是由于垃圾回收器只知道释放那些经由new分配的内存,对其他未使用new分配的内存空间则无能为力。

针对此情况,Java允许在类中定义一个名为finalize()的方法。

其工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

所以如果用finalize()就能在垃圾回收时刻做一些重要的清理工作。

而System.gc()则是启动一个垃圾回收器,在释放new分配内存空间之前,将会通过finalize()释放用其他方法分配的内存空间(如本地方法调用C中用new分配的内存空间)。

gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内 存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行 内存回收就要靠finalize(). 举个例子来说,当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() 否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法 调用它(free()). finalize的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.

JAVA中FINALIZE用法

方法:用a1=null来说明a1指向的内存为垃圾

FINALIZE方法就会被调用了

原因: 对此问题 通过看Java编程思想,自己有以下理解

ava有自己的垃圾回收机制,

1。

当对象没有用时,对象并不是立即被回收,而是当垃圾回收进程启动的时候,垃圾才会被回收,回收时会调用FINALIZE方法--另一种是调用System的gc()方法来强制的进行垃圾回收。

2.问什么会这样呢,因为回收垃圾也是浪费资源的一种现象,比如内存,cpu资源

举个JAVA中finalize()例子 在线等快

  final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。

因此一个类不能既被声明为 abstract的,又被声明为final的。

将变量或方法声明为final,可以保证它们在使用中不被改变。

被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。

被声明为final的方法也同样只能使用,不能重载。

  finally—再异常处理时提供 finally 块来执行任何清除操作。

如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

  finalize—方法名。

Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。

它是在 Object 类中定义的,因此所有的类都继承了它。

子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。

finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

  我在thinking in java中看见以下一段代码。

  //:Garbage.java   //Demonstration of the garbage   //collector and finalization   class Chair {   static boolean gcrun=false;   static boolean f=false;   static int created=0;   static int finalized=0;   int i;   Chair(){   i=++created;   if(created==47)   System.out.println("Created 47");   }   protected void finalize(){   if(!gcrun){   gcrun=true;   System.out.println(   "Beginning to finalize after"+created+   "Chairs have been created");   }   if(i==47){   System.out.println(   "Finalizing Chair #47,"+   "Setting flag to Chair creation");   f=true;   }   finalized++;   if(finalized>=created)   System.out.println(   "All"+finalized+"finalized");   }   }   public class Garbage{   public static void main(String[] args){   if(args.length==0){   System.out.println("Usage: "+   "java Garbage before or: "+   "java Garbage after");   return;   }   while(!Chair.f){   new Chair();   new String("To take up space");   }   System.out.println(   "After all chairs have been created: "+   "total created ="+Chair.created+   ",total finalized ="+Chair.finalized);   if(args[0].equals("before")){   System.out.println("gc():");   System.gc();   System.out.println("runFinalization():");   System.runFinalization();   }   System.out.println("bye");   if(args[0].equals("after"))   System.runFinalizersOnExit(true);   }   }///:-   为什么执行java Gerbage before   以后,当所有对象创建完(比如8000个),这时只清除了2000个(不定)   应该只能创建47个对象啊   分析:   首先,在一个循环当中创建对象,并且只是创建,而不引用,也就是说这个对象会自动的被系统当作垃圾处理掉。

但请注意,finalize()方法并不是立刻就会执行的,执行的时间完全由系统来决定。

所以很有可能的情况是已经创建了20000个对象,才开始其中的某一个对象的清除工作(这可能和时间或者系统内容的占用有关)。

看finalize()方法中的一段代码:   if (!gcrun) {   gcrun = true;   System.out.println(   " Beginning to finalize after" + created + "Chairs have been created at ");   }   就会出现这样的结果:   Beginning to finalize after 25038 Chairs have been created   这时对象的创建过程仍在继续(因为已经Finalize的对象还不满47个,Chair.f还是false)。

所以Chair.created会继续增加。

  直到有47个对象被清除了,Chair.f被置成true了,创建对象的循环才结束。

看main方法中的一段代码:   System.out.println(   " After all chairs have been created: "   + "total created ="   + Chair.created   + ",total finalized ="   + Chair.finalized+" ");   如上所说,Chair.created是不断增加的,而在这段代码执行之前,又会有N个对象被释放掉了,所以finalized也增加了。

  结果可能是这样的:   total created =29096,total finalized =73   其实这一过程和你使用的JVM有很大关系,执行结果可能会很不相同。

但有一点是可以肯定的,那就是我们无法确定JVM什么时候做对象的清除工作(这也是Thinking in java中这段代码的想要说明的),可能会在这个对象刚刚“无用”的时候就清除掉了,也可能滞后几秒,甚至永远不清除。

  如果你的开发环境支持跟踪的话,你可以以STEP的方式运行,你会看到运行结果大不相同。

给你看看我的运行结果:   Created 47   Beginning to finalize af   created   Finalizing Chair #47,Setting flag to Chair creation   After all chairs have been created:   total created =45993,total finalized =1800   gc():   runFinalization():   bye   All45993finalized   注意最后一行,因为人为的停顿,JVM有足够的时间将所有的对象都清除了。

  结论:   不能指望finalize()方法能稳定的工作,尤其不能依靠它来做文件的关闭等操作,由于finalize()的不确定性,往往得不到你想要的结果。

事实上我们只需要知道所有无用的对象,JVM会自己清除就够了。

IMIDC彩虹数据:日本站群多ip服务器促销;30Mbps带宽直连不限流量,$88/月

imidc怎么样?imidc彩虹数据或彩虹网络现在促销旗下日本多IP站群独立服务器,原价159美元的机器现在只需要88美元,而且给13个独立IPv4,30Mbps直连带宽,不限制月流量!IMIDC又名为彩虹数据,rainbow cloud,香港本土运营商,全线产品都是商家自营的,自有IP网络资源等,提供的产品包括VPS主机、独立服务器、站群独立服务器等,数据中心区域包括香港、日本、台湾、美国和南非...

bluehost32元/月,2核2G/20GB空间,独立ip,新一代VPS美国云主机!

bluehost怎么样?bluehost推出新一代VPS美国云主机!前几天,BlueHost也推出了对应的周年庆活动,全场海外虚拟主机月付2.95美元起,年付送免费的域名和SSL证书,通过活动进入BlueHost中文官网,购买虚拟主机、云虚拟主机和独立服务器参与限时促销。今天,云服务器网(yuntue.com)小编给大家介绍的是新一代VPS美国云主机,美国SSD云主机,2核2G/20GB空间,独立...

提速啦(24元/月)河南BGP云服务器活动 买一年送一年4核 4G 5M

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

finalize为你推荐
oncontextmenu鼠标右键很好用,但是左键一点反应也没有,请问是什么原因呢?备忘录模式手机如何设置备忘录提醒天融信防火墙天融信下一代防火墙有那些特点和优势?inode智能客户端inode智能客户端无法正常启动,根本开都开不了丁奇海贼王里“D”的意思是什么?欢迎页面windows欢迎界面ruby语言Ruby语言输入方法法弹幕播放器弹弹play播放器怎么样图片存储怎么把存图片存储另一种方式?新手怎么制作表格怎样能学会制作表格
代理主机 成都主机租用 免费linux主机 免费动态域名 liquidweb 香港主机 godaddy 双拼域名 ebay注册 免费asp空间 阿里云免费邮箱 lamp是什么意思 网页加速 免备案cdn加速 qq空间打开很慢 symantec 神棍节 海尔t68驱动 大硬盘分区 ddos攻击器 更多