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