您好,登錄后才能下訂單哦!
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。
Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。下面, 陜西優就業小編給大家分享十道題,大家可以嘗試著回答一下以下問題:
qunhao: 838 940 752
一、內存模型以及分區,需要詳細到每個區放什么。
(1)JVM 分為堆區和棧區,還有方法區,初始化的對象放在堆里面,引用放在棧里面, class 類信息常量池(static 常量和 static 變量)等放在方法區 new:
(2)方法區:主要是存儲類信息,常量池(static 常量和 static 變量),編譯后的代碼(字 節碼)等數據 · 堆:初始化的對象,成員變量(那種非 static 的變量),所有的對象實例和數組都要 在堆上分配
(3)棧:棧的結構是棧幀組成的,調用一個方法就壓入一幀,幀上面存儲局部變量表,操 作數棧,方法出口等信息,局部變量表存放的是 8 大基礎類型加上一個應用類型,所 以還是一個指向地址的指針
(4)本地方法棧:主要為 Native 方法服務
(5)程序計數器:記錄當前線程執行的行號
二、簡述java垃圾回收機制?
在java中,程序員是不需要顯示的去釋放一個對象的內存的,而是由虛擬機自行執行。在JVM中,有一個垃圾回收線程,它是低優先級的,在正常情況下是不會執行的。
只有在虛擬機空閑或者當前堆內存不足時,才會觸發執行,掃面那些沒有被任何引用的對象,并將它們添加到要回收的集合中,進行回收。
三、什么是類加載器,類加載器有哪些?
實現通過類的權限定名獲取該類的二進制字節流的代碼塊叫做類加載器。
主要有一下四種類加載器:
(1)啟動類加載器(Bootstrap ClassLoader)用來加載java核心類庫,無法被java程序直接引用。
(2)擴展類加載器(extensions class loader):它用來加載 Java 的擴展庫。Java 虛擬機的實現會提供一個擴展庫目錄。該類加載器在此目錄里面查找并加載 Java 類。
(3)系統類加載器(system class loader):它根據 Java 應用的類路徑(CLASSPATH)來加載 Java 類。一般來說,Java 應用的類都是由它來完成加載的。可以通過ClassLoader.getSystemClassLoader()來獲取它。
(4)用戶自定義類加載器,通過繼承 java.lang.ClassLoader類的方式實現。
四、GC 的兩種判定方法
(1)引用計數法:指的是如果某個地方引用了這個對象就+1,如果失效了就-1,當為 0 就會回收但是 JVM 沒有用這種方式,因為無法判定相互循環引用(A 引用 B,B 引用 A) 的情況。
(2)引用鏈法: 通過一種 GC ROOT 的對象(方法區中靜態變量引用的對象等-static 變量)來判斷,如果有一條鏈能夠到達 GC ROOT 就說明,不能到達GC ROOT 就說明可以回收 。
五、GC 收集器有哪些?CMS 收集器與 G1 收集器的特點。
并行收集器:串行收集器使用一個單獨的線程進行收集,GC 時服務有停頓時間 串行收集器:次要回收中使用多線程來執行 CMS 收集器是基于“標記—清除”算法實現的,經過多次標記才會被清除 G1 從整體來看是基于“標記—整理”算法實現的收集器,從局部(兩個 Region 之間) 上來看是基于“復制”算法實現的 。
六、說一下堆棧的區別?
(1)功能方面:堆是用來存放對象的,棧是用來執行程序的。
(2)共享性:堆是線程共享的,棧是線程私有的。
(3)空間大小:堆大小遠遠大于棧。
七、說一下類裝載的執行過程?
類裝載分為以下 5 個步驟:
(1)加載:根據查找路徑找到相應的 class 文件然后導入;
(2)檢查:檢查加載的 class 文件的正確性;
(3)準備:給類中的靜態變量分配內存空間;
(4)解析:虛擬機將常量池中的符號引用替換成直接引用的過程。符號引用就理解為一個標示,而在直接引用直接指向內存中的地址;
(5)初始化:對靜態變量和靜態代碼塊執行初始化工作。
八、簡述minor gc和full gc
(1)Minor GC:從新生代回收內存,關鍵是Eden區內存不足,造成不足的原因是Java對象大部分是朝生夕死(java局部對象),而死掉的對象就需要在合適的時機被JVM回收.
(2)Major GC:從老年代回收內存,一般比Minor GC慢10倍以上。
(3)Full GC:對整個堆來說的,出現Full GC通常伴隨至少一次Minor GC,但非絕對。Full GC被觸發的時候:老年代內存不足;持久代內存不足;統計得到的Minor GC晉升到老年代平均大小大于老年代空間。
九、Java內存模型的happen before原則
如果兩個操作存在happens-before關系,那么前一個操作的結果就會對后面一個操作可見,是定義的兩個操作之間的偏序關系,常見的規則:
(1)程序順序規則:一個線程中每個操作,happens-before于該線程中的任意后續操作。
(2)監視器鎖規則:對一個鎖的解鎖,happens-before于隨后這個鎖的加鎖。
(3)volatile變量規則:對一個volatile域的寫,happens-before于任意后續對這個域的讀。
(4)傳遞性:若A happens-before B,B happens-before C,則A happens-before C.
(5)start()規則:如果線程A執行ThreadB.start(),那么A線程的ThreadB.start()操作happens-before于線程B中的任意操作。
(6)join()規則:若線程A 執行ThreadB.join()并成功返回,則線程B的任意操作happens-before于線程A從ThreadB.jion()操作返回成功。
十、說一下 JVM 有哪些垃圾回收算法?
(1)標記-清除算法:標記無用對象,然后進行清除回收。缺點:效率不高,無法清除垃圾碎片。
(2)標記-整理算法:標記無用對象,讓所有存活的對象都向一端移動,然后直接清除掉端邊界以外的內存。
(3)復制算法:按照容量劃分二個大小相等的內存區域,當一塊用完的時候將活著的對象復制到另一塊上,然后再把已使用的內存空間一次清理掉。缺點:內存使用率不高,只有原來的一半。
(4)分代算法:根據對象存活周期的不同將內存劃分為幾塊,一般是新生代和老年代,新生代基本采用復制算法,老年代采用標記整理算法。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。