jvm面試常提的問題

1.JVM如何加載一個類的過程,雙親委派模型中有哪些方法

類加載過程:加載、驗證(驗證階段作用是保證Class文件的字節流包含的信息符合JVM規範,不會給JVM造成危害)、準備(準備階段為變量分配內存並設置類變量的初始化)、解析(解析過程是將常量池內的符號引用替換成直接引用)、初始化。

雙親委派模型中方法:雙親委派是指如果一個類收到了類加載的請求,不會自己先嚐試加載,先找父類加載器去完成。當頂層啟動類加載器表示無法加載這個類的時候,子類才會嘗試自己去加載。當回到最開的發起者加載器還無法加載時,並不會向下找,而是拋出ClassNotFound異常。

方法:啟動(Bootstrap)類加載器,標準擴展(Extension)類加載器,應用程序類加載器(Application ),上下文(Custom)類加載器。意義是防止內存中出現多份同樣的字節碼 。

2.GC算法(什麼樣的對象算是可回收對象,可達性分析),CMS收集器

jvm是如何判斷一個對象已經變成了可回收的“垃圾”,一般是兩個方法:引用記數法和根搜索算法。引用記數法沒辦法解決循環引用的問題,所以用根搜索。從一系列的”GC Roots“對象開始向下搜索,搜索走過的路徑稱為引用鏈。當一個對象到”GC Roots“之間沒有引用鏈時,被稱為引用不可達。引用不可到的對象被認為是可回收的對象。

幾種垃圾收集器:1,Serial New/Serial Old(串行),2,Parrallel New (並行),3,Parrallel Scavenge,4,Parrallel Old,5,CMS(CMS收集器是一個以獲得最短回收停頓時間為目標的收集器,它是一種併發收集器,採用的是Mark-sweep算法。),6,G1(是一款並行與併發收集器,並且可建立可預測的停頓時間模型,整體上是基於標記清理,局部採用複製)

3.JVM分為哪些區,每一個區幹嗎的?

1)方法區(method):被所有的線程共享。方法區包含所有的類信息和靜態變量。

2)堆(heap):被所有的線程共享,存放對象實例以及數組,Java堆是GC的主要區域。

3)棧(stack):每個線程包含一個棧區,棧中保存一些局部變量等。

4)程序計數器:是當前線程執行的字節碼的行指示器。

4.JVM新生代,老年代,持久代,都存儲哪些東西?

持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關係不大。所有新生成的對象首先都是放在年輕代的,年老代中存放的都是一些生命週期較長的對象。

5.內存溢出和內存洩漏:

內存溢出:程序申請內存時,沒有足夠的內存,out of memory;內存洩漏值垃圾對象無法回收,可以使用memory analyzer工具查看洩漏。

6.進程與線程:

進程值運行中的程序(獨立性,動態性,併發性),線程指進程中的順序執行流。區別是:1.進程間不共享內存 2.創建進程進行資源分配的代價要大得多,所以多線程在高併發環境中效率高。

7.序列化與反序列化:

序列化指將java對象轉化為字節序列,反序列化相反。主要是為了java線程間通訊,實現對象傳遞。只有實現了Serializable或Externalizable接口類對象才可被序列化。

8.64 位 JVM 中,int 的長度是多數?

Java 中,int 類型變量的長度是一個固定值,與平臺無關,都是 32 位。意思就是說,在 32 位 和 64 位 的Java 虛擬機中,int 類型的長度是相同的。

9.Java 中 WeakReference 與 SoftReference的區別?

Java中一共有四種類型的引用。StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。

StrongReference 是 Java 的默認引用實現, 它會盡可能長時間的存活於 JVM 內,當沒有任何對象指向它時將會被GC回收

WeakReference,顧名思義, 是一個弱引用, 當所引用的對象在

JVM 內不再有強引用時, 將被GC回收

雖然 WeakReference 與 SoftReference 都有利於提高 GC 和 內存的效率,但是 WeakReference ,一旦失去最後一個強引用,就會被 GC 回收,而 SoftReference 會盡可能長的保留引用直到 JVM 內存不足時才會被回收(虛擬機保證), 這一特性使得

SoftReference 非常適合緩存應用

10.解釋 Java 堆空間及 GC?

當通過 Java 命令啟動

Java 進程的時候,會為它分配內存。內存的一部分用於創建堆空間,當程序中創建對象的時候,就從對空間中分配內存。GC 是 JVM 內部的一個進程,回收無效對象的內存用於將來的分配。

11.Java 中堆和棧有什麼區別?

JVM 中堆和棧屬於不同的內存區域,使用目的也不同。棧常用於保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享。


分享到:


相關文章: