更新時間:2020-11-02 18:14:03 來源:動力節點 瀏覽2806次
虛擬機對于java程序員來說肯定不陌生,在實際的開發工作中會使用到虛擬機,java虛擬機的使用是程序員必會的技能之一,所以在java面試題中少不了虛擬機的知識,這篇文章總結了一些虛擬機面試題,是在面試中出現幾率很大的題目,有面試需要的朋友們可以來學習下面的內容。
1、什么是Java虛擬機?
答:Java虛擬機是一個可以執行Java字節碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的字節碼文件。Java被設計成允許應用程序可以運行在任意的平臺,而不需要java程序員為每一個平臺單獨重寫或者是重新編譯。Java虛擬機讓這個變為可能,因為它知道底層硬件平臺的指令長度和其他特性。
2、介紹下四種引用?
答:強引用:在程序代碼之中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象。
軟引用:用來描述一些還有用但并非必需的對象,使用SoftReference類來實現軟引用,在系統將要發生內存溢出異常之前,將會把這些對象列進回收范圍之中進行第二次回收。
弱引用:用來描述非必需對象的,使用WeakReference類來實現弱引用,被弱引用關聯的對象只能生存到下一次垃圾收集發生之前。
虛引用:是最弱的一種引用關系,使用PhantomReference類來實現虛引用,一個對象是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個對象實例。為一個對象設置虛引用關聯的唯一目的就是能在這個對象被收集器回收時收到一個系統通知。
3、解釋內存中的棧、堆和靜態區怎樣使用?
答:通常我們定義一個基本數據類型的變量,一個對象的引用,還有就是函數調用的現場保存都使用內存中的??臻g;而通過new關鍵字和構造器創建的對象放在堆空間;程序中的字面量(literal)如直接書寫的100、”hello”和常量都是放在靜態區中。??臻g操作起來最快但是棧很小,通常大量的對象都是放在堆空間,理論上整個內存沒有被其他進程使用的空間甚至硬盤上的虛擬內存都可以被當成堆空間來使用。
4、JVM永久代中會發生垃圾回收嗎?
答:垃圾回收不會發生在永久代,如果永久代滿了或者是超過了臨界值,會觸發完全垃圾回收(Full GC)。如果仔細查看垃圾收集器的輸出信息,就會發現永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。
5、Java內存堆和棧區別有什么?
答:(1)棧內存用來存儲基本類型的變量和對象的引用變量,堆內存用來存儲Java中的對象,無論是成員變量,局部變量,還是類變量,它們指向的對象都存儲在堆內存中;
(2)棧內存歸屬于單個線程,每個線程都會有一個棧內存,其存儲的變量只能在其所屬線程中可見,即棧內存可以理解成線程的私有內存,堆內存中的對象對所有線程可見。堆內存中的對象可以被所有線程訪問;
(3)如果棧內存沒有可用的空間存儲方法調用和局部變量,JVM會拋出java.lang.StackOverFlowError,如果是堆內存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError
(4)棧的內存要遠遠小于堆內存,如果你使用遞歸的話,那么你的棧很快就會充滿,-Xss選項設置棧內存的大小。-Xms選項可以設置堆的開始時的大小。
6、類的生命周期分什么階段?
答:加載過程:通過一個類的全限定名來獲取定義此類的二進制字節流,將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。在內存中(方法區)生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口;
驗證過程:為了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,文件格式驗證、元數據驗證、字節碼驗證、符號引用驗證;
準備過程:正式為類屬性分配內存并設置類屬性初始值的階段,這些內存都將在方法區中進行分配;
解析階段:虛擬機將常量池內的符號引用替換為直接引用的過程;
初始化階段:類初始化階段是類加載過程的最后一步。初始化階段就是執行類構造器()方法的過程。
7、JVM調優的工具有什么?
答:JDK自帶了很多監控工具,都位于JDK的bin目錄下,其中最常用的是jconsole和jvisualvm這兩款視圖監控工具。
jconsole:用于對 JVM中的內存、線程和類等進行監控;
jvisualvm:JDK 自帶的全能分析工具,可以分析:內存快照、線程快照、程序死鎖、監控內存的變化、gc變化等。
8、引起類加載操作有什么行為?
答:(1)遇到new、getstatic、putstatic或invokestatic這四條字節碼指令;(2)反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化;(3)子類初始化的時候,如果其父類還沒初始化,則需先觸發其父類的初始化;(4)虛擬機執行主類的時候(有 main(string[] args));(5)JDK1.7 動態語言支持。
9、GC是什么?為什么要GC?
答:GC 是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存?;厥諘е鲁绦蚧蛳到y的不穩定甚至崩潰,java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,java語言沒有提供釋放已分配內存的顯示操作方法。
10、 JVM 有哪些垃圾回收算法?
答:(1)標記-清除算法:標記無用對象,然后進行清除回收。缺點:效率不高,無法清除垃圾碎片;(2)復制算法:按照容量劃分二個大小相等的內存區域,當一塊用完的時候將活著的對象復制到另一塊上,然后再把已使用的內存空間一次清理掉。缺點:內存使用率不高,只有原來的一半;(3)標記-整理算法:標記無用對象,讓所有存活的對象都向一端移動,然后直接清除掉端邊界以外的內存;(4)分代算法:根據對象存活周期的不同將內存劃分為幾塊,一般是新生代和老年代,新生代基本采用復制算法,老年代采用標記整理算法。
以上是對必考虛擬機面試題的總結,這里整理了10道題目,是??嫉慕浀鋔ava虛擬機面試題。因為虛擬機屬于java零基礎教程中的內容,所以是程序員面試中必會的基礎知識,希望朋友們可以認真學習這10道虛擬機面試中涉及到的知識點,遇到不會的及時查漏補缺,順利通過面試。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習