垃圾收集算法的核心思想(1)

 

是我以前看到的一篇文章,我忘了的出。可能出自于JavaEye

但Java的圾收集算法特是Java的存泄漏问题,很得我们关注。

 

圾收集算法的核心思想

  Java言建立了圾收集机制,用以跟踪正在使用的象和发现并回收不再使用(引用)象。机制可以有效防范动态内存分配中可能生的两个:因多而引存耗,以及不恰放所造成的存非法引用。

  圾收集算法的核心思想是:对虚拟机可用存空,即堆空中的识别,如果象正在被引用,那么称存活象,反之,如果象不再被引用,则为垃象,可以回收其占据的空,用于再分配。圾收集算法的选择圾收集系统参数的合理调节直接影着系性能,因此需要开发做比深入的了解。

2.触发GC(Garbage Collector)

  JVM行次GC率很高,但因为这种GC占用时间极,所以统产生的影不大。更注的是主GC触发条,为它对很明来说,两个条会触发GC:
 

  ①当应用程序空闲时,线程在,GC用。因GC最低的线程中,所以当应用忙,GC线程就不,但以下件除外。

  Java存不足,GC用。当应线程在,程中建新,这时内存空不足,JVM强制地GC线,以便回收存用于新的分配。若GC一次之后仍不能存分配的要求,JVMGC一步的尝试,若仍无法足要求, JVM将报“out of memory”错误,Java停止。

  由于是否行主GCJVM根据系统环,而系统环境在不,所以主GC行具有不确定性,无法预计它必然出,但可以确定的是个长行的来说,其主GC是反复进行的。

3.GC开销的措施

  根据上述GC的机制,程序的直接影统环境的,而影GC触发。若不针对GC的特点设计编码,现内留等一系列面影了避免些影,基本的原就是可能地圾和GC程中的开销。具体措施包括以下几方面:

  (1)不要System.gc()

  此函JVM行主GC,然只是建而非一定,但很多情它会触发GC,而增加主GC,也即增加了歇性停的次

  (2)临时对象的使用

  临时对象在跳出函数调用后,为垃,少用临时变量就相少了圾的,而延了出上述第二个触发条件出时间,少了主GC的机

  (3)象不用最好式置Null

  一般而言,Null象都被作为垃,所以不用的式地设为Null,有利于GC收集器判定,而提高了GC的效率。

  (4)量使用StringBuffer,而不用String累加字符串(详见blog另一篇文章JAVAStringStringBuffer)

  由于String是固定的字符串,累加String,非在一String象中,而是重新建新的String,Str5=Str1+Str2+Str3+Str4,这条语程中会产生多个垃,为对次作“+”操作都必须创建新的String,统来说实际,增加更多的圾。避免这种可以改用StringBuffer累加字符串,StringBuffer是可变长,在原有基,会产生中间对象。

  (5)能用基本型如Int,Long,就不用Integer,Long

  基本量占用的源比相应对象占用的少得多,如果有必要,最好使用基本量。

  (6)量少用静态对

  静态变于全局,GC回收,它们会一直占用存。

  (7)分散建或除的时间

  集中在短时间内大量建新,是大,会导致突然需要大量,JVM在面临这种况时,只能行主GC,以回收存或整合存碎片,而增加主GC率。集中,道理也是一的。使得突然出了大量的,必然,而大大增加了下一次建新强制主GC的机

4.gcfinalize方法

  gc方法圾回收

  使用System.gc()可以不管JVM使用的是种垃圾回收的算法,都可以Java圾回收。需要注意的是,System.gc()仅仅是一个请求。JVM接受这个消息后,不是立即做圾回收,而只是个垃圾回收算法做了加,使圾回收操作容易生,或提早生,或回收多而已。

  finalize方法透视垃圾收集器的

  在JVM圾收集器收集一个对象之前 ,一般要求程序用适的方法源,但在有明确源的情下,Java提供了缺省机制来终止化该对源,这个方法就是finalize()的原型

  protected void finalize() throws Throwable

  在finalize()方法返回之后,象消失,圾收集行。原型中的throws Throwable表示可以抛出任何型的常。

  因此,当对象即,有需要做一些善后工作。可以把些操作finalize()方法里。

 

java

1.    protected void finalize()    

2.       {  

3.       // finalization code here  

4.       } 

 

示例

java

1.    class Garbage{    

2.       int index;  

3.       static int count;  

4.      

5.       Garbage() {  

6.       count++;  

7.       System.out.println("object "+count+" construct");  

8.       setID(count);  

9.       }  

10.    

11.     void setID(int id) {  

12.     index=id;  

13.     }  

14.    

15.     protected void finalize() //finalize方法   

16.     {  

17.     System.out.println("object "+index+" is reclaimed");  

18.     }  

19.    

20.     public static void main(String[] args)  

21.     {  

22.     new Garbage();  

23.     new Garbage();  

24.     new Garbage();  

25.     new Garbage();  

26.     System.gc(); //圾收集器   

27.     }  

28.    

29.   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值