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)化
缺:










2.循環(huán)內(nèi)不要?jiǎng)?chuàng)建對(duì)象
缺;







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









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)該采用如下方式







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):







改為






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






改為








5.乘法和除法考慮
缺:





改為:




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)如下:





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)該一樣。