JavaSE(二十三)——JVM
文章目錄
- 關于JVM相關的面試題
- 1. 什么是垃圾,垃圾判斷的方法有哪些?
- 2. JVM 回收算法和回收器,CMS 采用哪種回收算法,怎么解決內存碎片問題?
- 3. JVM類加載過程
- 4. JVM 內存分區
- 5. Java虛擬機的作用
關于JVM相關的面試題
1. 什么是垃圾,垃圾判斷的方法有哪些?
- 在 JVM 進行垃圾回收之前,首先就是判斷哪些對象是垃圾,也就是說,要判斷哪些對象是可以被銷毀的,其占有的空間是可以被回收的。根據 JVM 的架構劃分,我們知道, 在 Java 世界中,幾乎所有的對象實例都在堆中存放,所以垃圾回收也主要是針對堆來進行的。
- 垃圾就是指那些在堆中存在的,已經“死亡"的對象,即不可能再被任何途徑使用的對象。
- 垃圾判斷算法主要包括引用計數法和可達性分析法。
引用計數法
在這種算法中,假設堆中每個對象(不是引用)都有一個引用計數器。當一個對象被創建并且初始化賦值后,該對象的計數器的值就設置為 1,每當有一個地方引用它時,計數器的值就加 1,例如將對象 b 賦值給對象 a,那么 b 被引用,則將 b 引用對象的計數器累加 1。
反之,當引用失效時,例如一個對象的某個引用超過了生命周期(出作用域后)或者被設置為一個新值時,則之前被引用的對象的計數器的值就減 1。而那些引用計數為 0 的對象,就可以稱之為垃圾,可以被收集。
引用計數法的實現非常簡單,判定效率也很高,它很難解決對象之間相互循環引用的問題,主流Java虛擬機里面沒有選用引用計數器算法來管理內存。
可達性分析法
在主流的商用程序語言(Java、c#)的主流實現中都是通過可達性分析來判定對象是否存在的。這個算法的基本思路就是通過一系列的稱為“GC Roots”的對象作為起始點,從這些結點開始向下搜索,搜索所經過的路徑成為“引用鏈”,當一個對象到GC Roots沒有任何引用鏈時,則證明此對象是不可用的。
在Java語言中,可作為GC Roots的對象包括下面幾種:
- 虛擬機棧(棧幀中的本地變量表)中引用的對象
- 方法區中類靜態屬性引用的對象
- 方法區中常量引用的對象
- 本地方法棧中JNI(即一般說的native方法)引用的對象
如下圖所示,對象object 5、object 6、object 7雖然互相有關聯,但是它們到GC Roots是不可達的,所以它們將會被判定為是可回收的對象。
2. JVM 回收算法和回收器,CMS 采用哪種回收算法,怎么解決內存碎片問題?
標記-清除算法
- 將垃圾回收分為兩個階段:標記階段和清除階段。
- 在標記階段,首先通過根節點,標記所有從根節點開始的對象,未被標記的對象就是未被引用的垃圾對象。
- 在清除階段,清除所有未被標記的對象。
3. JVM類加載過程
JVM 類加載機制分為五個部分:加載,驗證,準備,解析,初始化
4. JVM 內存分區
java 內存通常被劃分為 5 個區域:程序計數器(Program Count Register)、本地方法棧 (Native Stack)、虛擬機棧(VM Stack)、方法區(Methon Area)、堆(Heap)
堆(Heap):是java虛擬機所管理的內存中最大的一塊內存區域,也是被各個線程共享的內存區域,該內存區域存放了對象實例及數組(但不是所有的對象實例都在堆中)。
方法區(Method Area):方法區也稱"永久代",它用于存儲虛擬機加載的類信息、常量、靜態變量、是各個線程共享的內存區域。
虛擬機棧(JVM Stack):描述的是java方法執行的內存模型:每個方法被執行的時候都會創建一個"棧幀",用于存儲局部變量表(包括參數)、操作棧、方法出口等信息。
本地方法棧(Native Stack): 與虛擬機棧基本類似,區別在于虛擬機棧為虛擬機執行的java方法服務,而本地方法棧則是為Native方法服務。(棧的空間大小遠遠小于堆)
程序計數器(PC Register): 是最小的一塊內存區域,它的作用是當前線程所執行的字節碼的行號指示器,在虛擬機的模型里,字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、異常處理、線程恢復等基礎功能都需要依賴計數器完成。
5. Java虛擬機的作用
解釋運行字節碼程序,消除平臺相關性
- jvm 將 java 字節碼解釋為具體平臺的具體指令。一般的高級語言如要在不同的平臺上運行, 至少需要編譯成不同的目標代碼。而引入 JVM 后,Java 語言在不同平臺上運行時不需要重新編 譯。Java 語言使用模式 Java 虛擬機屏蔽了與具體平臺相關的信息,使得 Java 語言編譯程序只 需生成在 Java 虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java 虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。
總結
以上是生活随笔為你收集整理的JavaSE(二十三)——JVM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaSE(二十二)——TCP协议的三
- 下一篇: JavaSE(二十四)——冒泡排序、选择