Java程序中的內(nèi)存管理機(jī)制是通過(guò)GC完成的,“一個(gè)對(duì)象創(chuàng)建后被放置在JVM的堆內(nèi)存中,當(dāng)永遠(yuǎn)不在應(yīng)用這個(gè)對(duì)象的時(shí)候?qū)?huì)被JVM在堆內(nèi)存中回收。被創(chuàng)建的對(duì)象不能再生,同時(shí)也沒(méi)有辦法通過(guò)程序語(yǔ)句釋放”(這個(gè)是《Java的GC機(jī)制》中提到的定義,呵呵,還依稀記得)這就是GC對(duì)垃圾對(duì)象的定義。個(gè)人感覺(jué)這么解釋或許會(huì)比較快理解:在運(yùn)行環(huán)境中JVM會(huì)對(duì)兩種內(nèi)存進(jìn)行管理,一種是堆內(nèi)存(對(duì)象實(shí)例或者變量),一種是棧內(nèi)存(靜態(tài)或非靜態(tài)方法),而JVM所管理的內(nèi)存區(qū)域?qū)嶋H上就是堆內(nèi)存+棧內(nèi)存(MS:對(duì)象實(shí)例+實(shí)例化變量+靜態(tài)方法+非靜態(tài)方法),當(dāng)JVM在其所管理的內(nèi)存區(qū)域的中無(wú)法通過(guò)根集合到達(dá)對(duì)象的時(shí)候就會(huì)將此對(duì)象作為垃圾對(duì)象實(shí)施回收。

下面是我在項(xiàng)目中對(duì)代碼進(jìn)行優(yōu)化的幾點(diǎn)嘗試,備忘

1.循環(huán)優(yōu)化
缺:

List alist=uSvr.getUserinfoList();

          for(int i=0;i
<alist.size();i++){

}
此種方式會(huì)一直去執(zhí)行alist.size()方法,帶來(lái)性能消耗,改為
for(int i=0 p=alist.size();i<p;i++){
   
}

2.循環(huán)內(nèi)不要?jiǎng)?chuàng)建對(duì)象
缺;
for(int i=1;i<=domainCount;i++){
        .            
AuditResult auditResult 
= new AuditResult();
                ..
}

這種做法會(huì)在內(nèi)存中保存N份這個(gè)對(duì)象的引用//會(huì)浪費(fèi)大量的內(nèi)存空間,改為

AuditResult auditResult;
for(int i=1;i<=domainCount;i++){
        .            
auditResult
=new AuditResult();
                ..
}

 3.  什么樣的對(duì)象可以將其認(rèn)定為不可視階段呢?舉個(gè)例子吧,在try{...}catch(Exception){...}代碼中,如果在try的代碼塊中聲明了一個(gè)obj,那么當(dāng)整個(gè) try{...}catch(Exception){...}代碼段執(zhí)行完畢以后這個(gè)obj實(shí)際上就已經(jīng)屬于不可視階段了。

所以,應(yīng)該采用如下方式

try{
   
   Object obj
=new Object();
}
catch(Excepione e){
obj
=null;
}


4.少用new創(chuàng)建對(duì)象
用new關(guān)鍵詞創(chuàng)建類(lèi)的實(shí)例時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。但如果一個(gè)對(duì)象實(shí)現(xiàn)了Cloneable接口,我們可以調(diào)用它的clone()方法。clone()方法不會(huì)調(diào)用任何類(lèi)構(gòu)造函數(shù)。
缺:
在使用設(shè)計(jì)模式(Design Pattern)的場(chǎng)合,如果用Factory模式創(chuàng)建對(duì)象,則改用clone()方法創(chuàng)建新的對(duì)象實(shí)例非常簡(jiǎn)單。例如,下面是Factory模式的一個(gè)典型實(shí)現(xiàn):

public static Credit getNewCredit() 
  

     
return new Credit(); 

  }
 


改為

private static Credit BaseCredit = new Credit(); 
  
public static Credit getNewCredit()  
   
return (Credit) BaseCredit.clone(); 
  }
 


當(dāng)new創(chuàng)建對(duì)象不可避免時(shí),注意避免多次的使用new初始化一個(gè)對(duì)象。 盡量在使用時(shí)再創(chuàng)建該對(duì)象。
缺:

NewObject object = new NewObject();
int value;
if(i>0 )
{
 value 
=object.getValue();
}
 

改為

int value;
if(i>0 )
{
 NewObject object 
= new NewObject();
 Value 
=object.getValue();
}
 

5.乘法和除法考慮

缺:

 for (val = 0; val < 100000; val +=5
   alterX 
= val * 8
   myResult 
= val * 2
  }
 

改為:

for (val = 0; val < 100000; val += 5
   alterX 
= val << 3
   myResult 
= val << 1
  }
 

6.盡量多的使用stringbuffer
7清除Session
  通常情況,當(dāng)達(dá)到設(shè)定的超時(shí)時(shí)間時(shí),同時(shí)有些Session沒(méi)有了活動(dòng),服務(wù)器會(huì)釋放這些沒(méi)有活動(dòng)的Session,.. 不過(guò)這種情況下,特別是多用戶并訪時(shí),系統(tǒng)內(nèi)存要維護(hù)多個(gè)的無(wú)效Session。
當(dāng)用戶退出時(shí),應(yīng)該手動(dòng)釋放,回收資源,實(shí)現(xiàn)如下:

HttpSession theSession = request.getSession();
// 獲取當(dāng)前Session
if(theSession != null){
 theSession.invalidate(); 
// 使該Session失效
}
 




NOTE:堆內(nèi)存是在JVM啟動(dòng)的時(shí)候創(chuàng)建,堆內(nèi)存分為新對(duì)象與老對(duì)象。對(duì)于新對(duì)象好像會(huì)分三個(gè)區(qū)域。當(dāng)優(yōu)先級(jí)最高的區(qū)域的堆棧滿了以后JVM將會(huì)進(jìn)行測(cè)試,測(cè)試內(nèi)容是那些對(duì)象不可到達(dá),不可到達(dá)的對(duì)象將會(huì)放入到老對(duì)象區(qū)域。同時(shí)JVM會(huì)將所有對(duì)象拷貝到另外兩個(gè)區(qū)域中,然后經(jīng)過(guò)一段時(shí)間依然沒(méi)有引用的對(duì)象會(huì)進(jìn)入老對(duì)象區(qū)域。對(duì)于老對(duì)象區(qū)域而言基本上就是等待被GC回收的對(duì)象了。(這些還是在大學(xué)時(shí)學(xué).net時(shí)候的知識(shí),直接換成java定義我想其中概念應(yīng)該一樣。