自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于Java垃圾回收問題

開發(fā) 后端
Java垃圾回收器負(fù)責(zé)回收無用對象占據(jù)的內(nèi)存資源.但也有特殊情況:假定你的對象(并非使用new)獲得了一塊"特殊"的內(nèi)存區(qū)域,這極大的簡化了程序開發(fā)人員的工作,但Java垃圾回收器也有其自身的問題。

Java垃圾回收器只知道釋放那些經(jīng)由new分配的內(nèi)存,所以它不知道該如何釋放該對象的這塊"特殊"內(nèi)存.為了應(yīng)對這種情況,Java允許在類中定義一個(gè)名為finalize()的方法.它的工作原理"假定"是這樣的:一旦Java垃圾回收器準(zhǔn)備好釋放對象占用的存儲(chǔ)空間,將首先調(diào)用其finalize()方法.并且在下一次垃圾回收動(dòng)作發(fā)生時(shí),才會(huì)真正回收對象占用的內(nèi)存.所以要是你打算用finalize(),就能在垃圾回收時(shí)刻做一些重要的清理工作.也許你會(huì)發(fā)現(xiàn),只要程序沒有瀕臨豐儲(chǔ)空間用完的那一刻,對象占用的空間就總也得不到釋放,如果程序執(zhí)行結(jié)束,并且垃圾回收器一直沒有釋放你創(chuàng)建的任何對象的存儲(chǔ)空間,則隨著程序的退出,那些資源也會(huì)全部交還給操作系統(tǒng).

這個(gè)策略是恰當(dāng)?shù)?因?yàn)槔厥毡旧硪灿虚_銷,要是不使用它,那就不用支付這部分開銷.所以你根本沒有辦法知道垃圾回收器會(huì)不會(huì)執(zhí)行,什么時(shí)候執(zhí)行.你要回收的對象不一定會(huì)被回收.finalize()方法用于清理什么樣的對象?如果我要清理某個(gè)對象,而該對象中含有其它對象,finalize()就應(yīng)該明確釋放那些對象呢?

不----無論對象是如何創(chuàng)建的,Java垃圾回收器都會(huì)負(fù)責(zé)釋放對象占據(jù)的所有內(nèi)存.這就將對finalize()的需求限制到一種特殊情況,即通過某種創(chuàng)建對象方式以外的方式為對象分配存儲(chǔ)空間.不過,大家也看到,Java中一切皆為對象,那這種特殊情況是怎么回事?看來之所以要有finalize(),是由于在分配內(nèi)存時(shí)可能采用了類似C語言中的做法.而非Java中的通常做法.

這種情況主要發(fā)生在使用"本地方法"的情況下,本地方法是一種在Java中調(diào)用非Java代碼的方式.本地方法目前只支持C和C++,但它們可以調(diào)用其他語言寫的代碼,所以實(shí)際上可以調(diào)用任何代碼.在非Java代碼中,也許會(huì)調(diào)用C的malloc()函數(shù)系列來分配存儲(chǔ)空間,而且除非調(diào)用了free()函數(shù),否則存儲(chǔ)空間將得不到釋放,從而造成內(nèi)存泄露.當(dāng)然,free()是C和C++中的函數(shù),所以要在finalize()中用本地方法調(diào)用它.至此,大家或許明白了不要過多地使用finalize()的道理了.System.gc(),強(qiáng)行運(yùn)行垃圾回收器.

finalize()在什么時(shí)候被調(diào)用?有三種情況1.對象被Garbage Collection時(shí)自動(dòng)調(diào)用,比如運(yùn)行System.gc()的時(shí)候.2.程序退出時(shí)為每個(gè)對象調(diào)用一次finalize方法。3.顯式的調(diào)用finalize方法

除此以外,正常情況下,當(dāng)某個(gè)對象被系統(tǒng)收集為無用信息的時(shí)候,finalize()將被自動(dòng)調(diào)用,但是jvm不保證finalize()一定被調(diào)用,也就是說,finalize()的調(diào)用是不確定的,這也就是為什么sun不提倡使用finalize()的原因.

測試代碼 package test;  

  1. /**     
  2.  * 測試?yán)厥掌髋cfinalize()方法     
  3.  * @author Administrator     
  4.  */     
  5. public class GcTest {     
  6.    public static void main(String[] args) {     
  7.         Book b1 = new Book();     
  8.         b1.setName("new");             
  9.         Book b2 = new Book();     
  10.         b2.setName("old");             
  11.         /*     
  12.          * 把b2引用指向null.讓b2引用所指的Book對象不在有引用指向它.     
  13.          * 垃圾回收器運(yùn)行時(shí),讓對象回收掉.     
  14.          */     
  15.         b2 = null;           
  16.         /*     
  17.          * 強(qiáng)行運(yùn)行垃圾回收器.     
  18.          */     
  19.         System.gc();     
  20.     }     
  21. }     
  22.     
  23. class Book{            
  24.     private String name;     
  25.          
  26.     public String getName() {     
  27.         return name;     
  28.     }            
  29.     public void setName(String name) {     
  30.         this.name = name;     
  31.     }            
  32.     @Override     
  33.     protected void finalize() throws Throwable {     
  34.         // TODO Auto-generated method stub     
  35.         super.finalize();     
  36.         System.out.println(getName()+"--->執(zhí)行GC工作.");     
  37.     }     
  38. }    
  39. package test;  
  40. /**  
  41.  * 測試?yán)厥掌髋cfinalize()方法  
  42.  * @author Administrator  
  43.  */  
  44. public class GcTest {  
  45.    
  46.  public static void main(String[] args) {  
  47.   Book b1 = new Book();  
  48.   b1.setName("new");   
  49.   Book b2 = new Book();  
  50.   b2.setName("old");    
  51.   /*  
  52.    * 把b2引用指向null.讓b2引用所指的Book對象不在有引用指向它.  
  53.    * 垃圾回收器運(yùn)行時(shí),讓對象回收掉.  
  54.    */  
  55.   b2 = null;    
  56.   /*  
  57.    * 強(qiáng)行運(yùn)行垃圾回收器.  
  58.    */  
  59.   System.gc();  
  60.  }  
  61. }  
  62.  
  63. class Book{   
  64.  private String name;  
  65.  public String getName() {  
  66.   return name;  
  67.  }  
  68.  public void setName(String name) {  
  69.   this.name = name;  
  70.  }  
  71.  @Override  
  72.  protected void finalize() throws Throwable {  
  73.   // TODO Auto-generated method stub  
  74.   super.finalize();  
  75.   System.out.println(getName()+"--->執(zhí)行GC工作.");  
  76.  }  

結(jié)果代碼

old--->執(zhí)行GC工作. 

【編輯推薦】

  1. Java連接MySQL中文亂碼處理
  2. 在Java應(yīng)用程序中使用Jfreechart配置
  3. Java虛擬機(jī)內(nèi)部構(gòu)成淺析
  4. 淺談Java線程的生命周期
  5. 關(guān)于Java繼承的一些復(fù)習(xí)
責(zé)任編輯:彭凡 來源: javaeye
相關(guān)推薦

2021-01-04 10:08:07

垃圾回收Java虛擬機(jī)

2009-12-30 10:14:29

JVM垃圾回收

2010-12-13 11:14:04

Java垃圾回收算法

2015-04-21 11:33:37

JavaJava垃圾回收

2022-01-20 10:34:49

JVM垃圾回收算法

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2022-07-27 08:01:29

CMS垃圾回收器

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2015-07-06 10:14:25

Java垃圾回收實(shí)戰(zhàn)

2009-07-06 17:34:22

Java垃圾回收

2009-06-23 14:15:00

Java垃圾回收

2021-11-05 15:23:20

JVM回收算法

2012-01-09 17:06:16

JavaJVM

2014-12-19 11:07:40

Java

2011-07-04 16:48:56

JAVA垃圾回收機(jī)制GC

2011-06-28 12:39:34

Java垃圾回收

2015-06-04 09:38:39

Java垃圾回收機(jī)

2023-08-08 10:29:55

JVM優(yōu)化垃圾回收

2023-12-19 21:52:51

Go垃圾回收開發(fā)

2020-07-09 08:26:42

Kubernetes容器開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號