天天看點

java面試題 垃圾回收機制 GC BAT面試題系列 基礎篇(十四)

● 請簡單描述一下垃圾回收器的基本原理是什麼?還有垃圾回收器可以馬上回收記憶體嗎?并且有什麼辦法可以主動通知虛拟機進行垃圾回收呢?

考察點:垃圾回收

參考回答:

對于GC來說,當程式員建立對象時,GC就開始監控這個對象的位址、大小以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式确定哪些對象是”可達的”,哪些對象是”不可達的”。當GC确定一些對象為”不可達”時,GC就有責任回收這些記憶體空間。可以。程式員可以手動執行System.gc(),通知GC運作,但是Java語言規範并不保證GC一定會執行。

● 請問,在java中會存在記憶體洩漏嗎?請簡單描述一下。

考察點:記憶體

參考回答:

Java中的确存在Java的記憶體洩漏, 并且事态可以變得相當嚴重

Java garbage collector自動釋放哪些記憶體裡面程式不在需要的對象, 以此避免大多數的其他程式上下文的記憶體洩漏. 但是Java應用程式依舊會有相當的記憶體洩漏. 查找原因會十分困難.

有兩類主要的Java記憶體洩漏:

* 不再需要的對象引用

* 未釋放的系統資源

2.2 非必要的對象引用

Java代碼常常保留對于不再需要的對象引用, 并且這組織了記憶體的垃圾收集器的工作. Java對象通常被其他對象包含引用, 為此一個單一對象可以保持整個對象樹在記憶體中, 于是導緻了如下問題:

* 在向數組添加對象以後遺漏了對于他們的處理

* 直到你再次使用對象的時候都不釋放引用. 比如一個菜單指令可以插件一個對象執行個體引用并且不釋放便于以後再次調用的時候使用, 但是也許永遠不會發生.

* 在其他引用依然需要舊有狀态的時候貿然修改對象狀态. 比如當你為了在一個文本檔案裡面儲存一些屬性而使用一個數組, 諸如”字元個數”等字段在不再需要的時候依然保留在記憶體當中.

* 允許一個長久執行的線程所引用的對象. 設定引用為NULL也無濟于事, 線上程退出和空閑之前, 對象不會被收集釋放

2.3 未釋放的系統資源

Java方法可以定位Java執行個體意外的堆記憶體, 諸如針對視窗和位圖的記憶體資源. Java常常通過JNI(Java Native Interface)調用C/C++子程式定位這些資源.

● 請說明一下垃圾回收的優點以及原理。

考察點:垃圾回收

參考回答:

Java 語言中一個顯著的特點就是引入了垃圾回收機制,使c++程式員最頭疼的記憶體管理的問題迎刃而解,它使得Java程式員在編寫程式的時候不再需要考慮記憶體管理。由于有個垃圾回收機制,Java中的對象不再有"作用域"的概念,隻有對象的引用才有"作用域"。垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨的低級别的線程運作,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程式員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代複制垃圾回收和标記垃圾回收,增量垃圾回收。

● 請問GC是什麼? 還有為什麼要有GC?

考察點:回收

參考回答:

GC是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導緻程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域進而達到自動回收記憶體的目的,Java語言沒有提供釋放已配置設定記憶體的顯示操作方法。

● 請簡述一下GC算法

考察點:JVM

參考回答:

①GC(GarbageCollection 垃圾收集),GC的對象是堆空間和永久區

②GC算法包含:引用計數法,标記清除,标記壓縮,複制算法。

③引用計數器的實作很簡單,對于一個對象A,隻要有任何一個對象引用了A,則A的引用計數器就加1,當引用失效時,引用計數器就減1。隻要對象A的引用計數器的值為0,則對象A就不可能再被使用。

④标記-清除算法是現代垃圾回收算法的思想基礎。标記-清除算法将垃圾回收分為兩個階段:标記階段和清除階段。一種可行的實作是,在标記階段,首先通過根節點,标記所有從根節點開始的可達對象。是以,未被标記的對象就是未被引用的垃圾對象。然後,在清除階段,清除所有未被标記的對象。與标記-清除算法相比,複制算法是一種相對高效的回收方法不适用于存活對象較多的場合如老年代将原有的記憶體空間分為兩塊,每次隻使用其中一塊,在垃圾回收時,将正在使用的記憶體中的存活對象複制到未使用的記憶體塊中,之後,清除正在使用的記憶體塊中的所有對象,交換兩個記憶體的角色,完成垃圾回收。

● 什麼原因會導緻minor gc運作頻繁?同樣的,什麼原因又會導緻minor gc運作很慢?請簡要說明一下

考察點:GC

參考回答:

可能是堆記憶體太小。

● 請問java中記憶體洩漏是什麼意思?什麼場景下會出現記憶體洩漏的情況?

考察點:記憶體洩漏

參考回答:

Java中的記憶體洩露,廣義并通俗的說,就是:不再會被使用的對象的記憶體不能被回收,就是記憶體洩露。如果長生命周期的對象持有短生命周期的引用,就很可能會出現記憶體洩露。

轉載于:https://www.cnblogs.com/readlearn/p/10958097.html