




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Java GC面試題及答案(15題)L既然有GC機(jī)制,為什么還會有內(nèi)存泄露的情況?理論上Java因?yàn)橛欣厥諜C(jī)制(GC)不會存在內(nèi)存泄露問題(這也是Java被廣泛使用于服務(wù)器端編程的一個圭要原因).然而在實(shí) 際開發(fā)中,可能會存在無用但可達(dá)的對象,這些對象不能被GC回收,因此也會導(dǎo)致內(nèi)存泄露的發(fā)生.例如hibernate的Session (一級緩存)中的對象屬于持久態(tài),垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的 垃圾對象,如果不及時關(guān)閉(close )或清空(flush ) 一級緩存就可能魏內(nèi)存泄露.下面例子中的代碼也會導(dǎo)致內(nèi)存泄露.jeiva ut.il .Arrays;
2、javei , util , EmptyStackExceptiion;MySlackT elements;size = 0;工NIT CAPACITY -elements - (T) Object1N1T CAPACITY;push(T elcm) push(T elcm) push(T elcm) push(T elcm) elements sizg+ + J = eleni;(size = 0)(size = 0)(size = 0)EmptyStackException();(size = 0)EmptyStackException();elements-sizg;onsureCapa
3、cily () (elements. len- elements - Arrays.copyOf (elements,2 size !);上面的代碼實(shí)現(xiàn)了一個棧(先進(jìn)后出(FILO )結(jié)構(gòu),乍看之下似乎沒有什么明顯的問題,它甚至可以通過你編寫的各種單元測試.然 而其中的pop方法卻存在內(nèi)存泄露的問題,當(dāng)我們用pop方法彈出棧中的對象時,該對象不會被當(dāng)作垃圾回收,即使使用棧的程序不再 引用這些對象,因?yàn)闂?nèi)部維護(hù)著對這些對象的過期引用(obsolete reference )。在支持垃圾回收的語言中,內(nèi)存泄露是很隱蔽的, 這種內(nèi)存泄露其實(shí)就是無意識的對象保持.如果一個對象引用被無意識的保存起來了
4、,那么垃圾回收器不會處理這個對段,也不會處理 該對象引用的X他對象,即使這樣的對象只有少數(shù)幾個,也可能會導(dǎo)致很多的對象被排除在垃圾回收之外,從而對性能造成更大影響, 極端情況下會引發(fā)Disk Paging (物理內(nèi)存與硬盤的虛擬內(nèi)存交換數(shù)據(jù)),甚至造成。utOfMemoryError.2、Java中為什么會有GC機(jī)制呢?安全性考慮;-for security.減少內(nèi)存泄露;-erase memory leak in some degree.減少程序員工作IL -Programmers dont worry about memory releasing.3、對于Java的GC哪些內(nèi)存需要回收?內(nèi)
5、存運(yùn)行時JVM會有一個運(yùn)行時數(shù)據(jù)區(qū)來管理內(nèi)存.它主要包括5大局部:.程序計(jì)數(shù)器(Program CounterRegister);.虛擬機(jī)筏(VM Stack);.本地方法棧(Native Method Stack);.方法區(qū)(Method Area);5.堆(Heap).而其中程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧是每個線程私有的內(nèi)存空間,隨線程而生,隨線程而亡.例如棧中每一個棧幀中分配多少內(nèi) 存基本上在類結(jié)構(gòu)確定是哪個時就了,因此這3個區(qū)域的內(nèi)存分配和回收都是確定的,無需考慮內(nèi)存回收的問題.但方法區(qū)和堆就不同了,一個接口的多個實(shí)現(xiàn)類需要的內(nèi)存可能不一樣,我們只有在程序運(yùn)行期間才會知道會創(chuàng)立哪些對
6、象,這局部內(nèi) 存的分配和回收都是動態(tài)的,GC主要關(guān)注的是這局部內(nèi)存.總而言之,GC主要進(jìn)行回收的內(nèi)存是JVM中的方法區(qū)和堆.4、Java的GC什么時候回收垃圾?在面試中經(jīng)常會碰到這樣一個問題(事實(shí)上筆者也碰到過):如何判斷一個對象已經(jīng)死去?很容易想到的一個答案是:對一個對象添加引用計(jì)數(shù)器,每當(dāng)有地方引用它時,計(jì)數(shù)器值加1 ;當(dāng)引用失效時,計(jì)數(shù)器值減1.而當(dāng)計(jì)數(shù) 器的值為0時這個對象就不會再被使用,判斷為已死.是不是簡單又直觀。然而,很遺憾。這種做法是錯誤的!為什么是錯的呢?事實(shí) 上,用引用計(jì)數(shù)法照實(shí)在大局部情況下是一個不錯的解決方案,而在實(shí)際的應(yīng)用中也有不少案例,但它卻無法解決對象之間的循環(huán)引
7、用 問題。比方對象A中有一個字段指向了對象B ,而對象B中也有一個字段指向了對象A ,而事實(shí)上他們倆都不再使用,但計(jì)數(shù)器的值永 遠(yuǎn)都不可能為0 ,也就不會被回收,然后就發(fā)生了內(nèi)存泄露.正確的做法應(yīng)該是怎樣呢?在Java , C#等語言中,比擬主流的判定f 對象已死的方法是:可達(dá)性分析(Reachability Analysis).所有生成的對象都是一個稱為.GC Roots”的根的子樹.從GC Roots開始向下搜索,搜索所經(jīng)過的路徑稱為引用鹿(Reference Chain),當(dāng)一個對象到GC Roots沒有任何 引用鏈可以到達(dá)時,就稱這個對象是不可達(dá)的(不可引用的),也就是可以被GC回收了
8、.無論是引用計(jì)數(shù)器還是可達(dá)性分析,判定對蕊是否存活都與引用有關(guān)!那么,如何定義對象的引用呢?我們希望給出這樣一類描述:當(dāng)內(nèi)存空間還夠時,能夠保存在內(nèi)存中;如果進(jìn)行了垃圾回收之后內(nèi)存空間仍舊非常緊張,那么可以拋棄這 些對象.所以根據(jù)不同的需求,給出如下四種引用,根據(jù)引用類型的不同,GC回收時也會有不同的操作:強(qiáng)引用(Strong Reference):Object obj=new Object。;只要強(qiáng)引用還存在,GC永遠(yuǎn)不會回收掉被引用的對象.軟引用(Soft Reference):描述一些還有用但非必需的對象.在系統(tǒng)將會發(fā)生內(nèi)存溢出之前,會把這些對象列入回收范圍進(jìn)行二次回收 (即系統(tǒng)將會發(fā)生
9、內(nèi)存溢出了,才會對他們進(jìn)行回收)弱引用(Weak Reference):程度比軟引用還要弱一些.這些對象只能生存到下次GC之前.當(dāng)GC工作時,無論內(nèi)存是否足夠都會將其 回收(即只要進(jìn)行GC ,就會對他們進(jìn)行回收.)虛引用(Phantom Reference):一個對象是否存在虛引用,完全不會對其生存時間構(gòu)成影響。關(guān)于方法區(qū)中需要回收的是一些廢棄的常 信和無用的類.L廢棄的常量的回收。這里看引用計(jì)數(shù)就可以了。沒有對象引用該常量就可以放心的回收了.2.無用的類的回收.什么是無用的類呢?A.該類所有的實(shí)例都己2被回收.也就是Java堆中不存在該類的任何實(shí)例;B加載該類的ClassLoader已經(jīng)被回
10、收;C該類對應(yīng)的對象沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法.總而言之:對于堆中的對象,主要用 可達(dá)性分析判斷一個對象是否還存在引用,如果該對嵌沒有任何引用就應(yīng)該被回收.而根據(jù)我們實(shí)際對引用的不同需求,又分成了 4種 引用,每種引用的回收機(jī)制也是不同的.對于方法區(qū)中的常量和類,當(dāng)一個常量沒有任何對象引用它,它就可以被回收了。而對于類, 如果可以判定它為無用類,就可以被回收了.5、通過10個例如來初步認(rèn)識Java8中的lambda表達(dá)式用lambda表達(dá)式實(shí)現(xiàn)Runnable/ Java 8 之前:Thread( Runnable () .startrincln( Bctore
11、Jhh8 too much ccdo for loo little lo do );) .startThread()-System,out.printlnhi Java8. Lambda expression rocks !”),start();輸出:too much code , for too little to doLambda expression rocks!這個例子向我們展示了 Java 8 lambda表達(dá)式的語法.你可以使用lambda寫出如下代碼:statementtamsj expression params)例如,如果你的方法不對參數(shù)進(jìn)行修改、至寫,只是在控制臺打印點(diǎn)東西
12、的話,那么可以這樣寫:statementHello Laabdii Expressions );如果你的方法接收兩個參數(shù),那么可以寫成如下這樣:even, odd) - even + od眼便提一句,通常都會把lambda表達(dá)式內(nèi)部變后的名字起得短一些.這樣能使代碼更簡短,放在同一行.所以,在上述代碼中,變最 名選用a、B或者x、y會比even、0dd要好.使用Java 8 lambda衷達(dá)式進(jìn)行事件處理如果你用過Swing API編程,你就會記得怎樣寫事件監(jiān)聽代碼。這又是一個舊版本簡單匿名類的經(jīng)典用例,但現(xiàn)在可以不這樣了。你可 以用lambda表達(dá)式寫出更好的事件監(jiān)聽代碼,如下所示:Butt
13、on show = JButton( Show ); show.addActionListener (ActionListener) dellonPeriormoc(ActlonEvenl e) System.out .println ( Event handling wiihout lambda expression is boringshow , addActionListenerStem,out .print In (Light, CamerH, Action !|ambda oxprossions Rocks);使用Java 8 lambda表達(dá)式進(jìn)行事件處理使用lambda表達(dá)式對列
14、表進(jìn)行迭代如果你使過幾年Java ,你就知道針對集合類,最常見的操作就是進(jìn)行迭代,并將業(yè)務(wù)邏輯應(yīng)用于各個元素,例如處理訂單、交易和事件 的列表.由于Java是命令式語言,Java 8之前的所有循環(huán)代碼都是I頂序的,即可以對其元素進(jìn)行并行化處理,如果你想做并行過謔,就 需要自己寫代碼,這并不是困容易.通過引入lambda表達(dá)式和默認(rèn)方法,將做什么和怎么做的問題分開了 ,這意味著Java集合現(xiàn)在 知道怎樣做迭代,并可以在API層面對集合元素進(jìn)行并行處理.下面的例子里,我將介紹如何在使用lambda或不使用lambda表達(dá)式 的情況下迭代列表.你可以看到列表現(xiàn)在有了 forEach。方法,它可以迭代
15、所有對象,并將你的lambda代碼應(yīng)用在其中.|List features = Arrays .dsListLambdas Defaul l Mclhod , SlrcaiaAPI Date and Time API ); (String feature :features)stemout printin(feature);List features = Arrays .msList ( Laabdas , Defaull Molhod Stream API . Ddle and Time API );features,forEach(n - System.??赾.println(口);eal
16、ures forEach(System.out:printin)輸出:Lambdas Default Method Stream APIDate and Time API列表循環(huán)的最后 f例子展示了如何在Java 8中使用方法引用(method reference ).你可以看到C + +里面的雙目號.范圍解析操作 符現(xiàn)在在Java 8中用來表示方法引用.使用lambda表達(dá)式和函數(shù)式接口 Predicate除了在語言層面支持函數(shù)式編程風(fēng)格Java 8也添加了一個包,叫做java.utiLfunction.它包含了很多類,用來支持Java的函數(shù)式編程. 其中一個便是Predicate ,使用函
17、數(shù)式接口以及l(fā)ambda表達(dá)式,可以向API方法添加邏輯,用更少的代 碼支持更多的動態(tài)行為.下面是Java 8 Predicate的例子,展示了過謔集合數(shù)據(jù)的多種常用方法.Predicate接口非常適用于做過派.List 二anguages=Auays asList (JavzJ, Scala, C+, Haskell, Lisp);filter(Languages, (str)-str.startsWith( J );rintln( languages uhich ends wiih a );f ilr.ar (st r ( ,i );System, out .print In ( Print all languages :);filter(languages, (str)System.out .printIn ( Pi int no language : );filter(languages.System.out.println ( Prinl liingiuig。 whose lenglh grouter Ihun 4:);eSr (str)-str.length()I);filler(List names. Predicate condition)(condit
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廉潔從業(yè)教育
- 農(nóng)業(yè)科技園區(qū)建設(shè)對2025年新型農(nóng)業(yè)經(jīng)營主體培育的影響
- 中級養(yǎng)老護(hù)理培訓(xùn)
- 安徽省皖江名校2024-2025學(xué)年高一下學(xué)期5月月考政治試卷(含答案)
- 保育員對幼兒的冬季護(hù)理
- 電話銷售相關(guān)培訓(xùn)課件
- 腦卒中早期康復(fù)護(hù)理
- 開心工作培訓(xùn)課件
- 藥店員工培訓(xùn)
- 中醫(yī)內(nèi)科護(hù)理常規(guī)
- 人體寄生蟲學(xué)實(shí)驗(yàn)課件
- 房屋買賣居間合同書范本
- 大家的日語(電子版)
- “怎樣提高學(xué)生的計(jì)算能力”教研活動方案
- 談戀愛被騙民事起訴狀范本
- 錘擊樁(砼預(yù)制方樁、預(yù)應(yīng)力砼管樁、鋼樁)工程旁站監(jiān)理記錄
- 老年患者術(shù)后譫妄課件
- 國開2023年春《互換性與技術(shù)測量》形考任務(wù)一二三四參考答案
- GB/T 42532-2023濕地退化評估技術(shù)規(guī)范
- 會計(jì)知識大賽初賽題庫
- 鎖梁自動成型機(jī)構(gòu)課程設(shè)計(jì)
評論
0/150
提交評論