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会自己清除就够了。

A400互联(49元/月)洛杉矶CN2 GIA+BGP、1Gbps带宽,全场独服永久5折优惠

a400互联是一家成立于2020年商家,主营美国机房的产品,包括BGP线路、CN2 GIA线路的云服务器、独立服务器、高防服务器,接入线路优质,延迟低,稳定性高,额外也还有香港云服务器业务。当前,全场服务器5折,香港VPS7折,洛杉矶VPS5折,限时促销!A400互联官网:https://a400.net/优惠活动全场独服永久5折优惠(续费同价):0722香港VPS七折优惠:0711洛杉矶VPS五...

CloudCone,美国洛杉矶独立服务器特价优惠,美国洛杉矶MC机房,100Mbps带宽不限流量,可选G口,E3-1270 v2处理器32G内存1Gbps带宽,69美元/月

今天CloudCone发布了最新的消息,推送了几款特价独立服务器/杜甫产品,美国洛杉矶MC机房,分配100Mbps带宽不限流量,可以选择G口限制流量计划方案,存储分配的比较大,选择HDD硬盘的话2TB起,MC机房到大陆地区线路还不错,有需要美国特价独立服务器的朋友可以关注一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2...

Webhosting24:€15/年-AMD Ryzen/512MB/10GB/2TB/纽约&日本&新加坡等机房

Webhosting24是一家始于2001年的意大利商家,提供的产品包括虚拟主机、VPS、独立服务器等,可选数机房包括美国洛杉矶、迈阿密、纽约、德国慕尼黑、日本、新加坡、澳大利亚悉尼等。商家VPS主机采用AMD Ryzen 9 5950X CPU,NVMe磁盘,基于KVM架构,德国机房不限制流量,网站采用欧元计费,最低年付15欧元起。这里以美国机房为例,分享几款套餐配置信息。CPU:1core内存...

finalize为你推荐
微信收款语音播报怎么设置怎么修改微信收款提示音weakhashmapMap接口,HashMap和HashTable的相同点和不同点分别是什么?jdk6jdk-6u14-windows-i586.exe是什么,具体点,谢谢inode智能客户端inode智能客户端无法正常启动,根本开都开不了数秦科技安徽数智通科技有限公司怎么样?ruby语言公司实习让我学习RUBY语言,不知道RUBY语言发展前景怎么样,值不值的去学习。弹幕网站谁能给我解释一下什么叫A站,什么叫B站?都是啥网站?社工库网站怎么找社工库?国际加速世界经济全球化加速发展的表现有哪些?在全球化趋势加强的过程中,人类共同面临的问题有哪些?图片存储怎么设置图片的保存类型
虚拟主机测评 cn域名注册 google电话 hostmaster bbr 外贸主机 标准机柜尺寸 英文站群 阿里云浏览器 域名转接 如何用qq邮箱发邮件 ebay注册 德讯 免费赚q币 美国主机侦探 中美互联网论坛 美国服务器 免费服务器 瓦工工资 装修瓦工招聘 更多