面試 複習JVM

Java虛擬機

Java編譯器的輸出是字節碼(byteCode).字節碼是一套設計用來在java運行時系統下執行的高度優化的指令集,該Java運行時系統稱爲Java虛擬機(Java Virtual Machine, JVM). 在其標準形式下,JVM就是一個字節碼解釋器.

運行時數據區
1 程序計數器

可以看做是線程執行的字節碼行號指示器

2 Java虛擬機棧

虛擬機描述的是Java方法執行的內存模型, 每個方法在執行的同時都會創建一個棧針(Stack frame) 用於存儲局部變量表,操作數棧,動態鏈接,方法出口信息

3 本地方法棧

服務於本地方法

4 java堆

JVM管理內存中最大的一塊,因爲GC一般發生在堆上, 所以也叫GC堆, 對象分配的空間, 細分又會分爲 年輕代(Eden, From, To), 老年代

5 方法區

存儲類加載的信息, 常量, 靜態變量

6 運行時常量池

屬於方法區, 存儲字面常量, 符號引用

1~3 線程私有的空間 4~6 公共空間

垃圾收集器與內存分配策略

  1. 引用計數法 很難解決循環引用
  2. 可達性分析算法

GCRoots的對象有下面幾種

  1. 虛擬機棧中的引用的對象
  2. 方法區中的靜態, 常量引用的對象
  3. 本地方法棧中引用的對象

強軟弱虛引用

強 只要引用存在,就不會回收
軟 有用但非必須 將要發生內存溢出的時候,就會被回收
弱 非必須 下次GC前存活
虛 爲了標記對象在被回收是發送一個系統通知

對象GC發生的時

判斷當前對象是否有必要執行finalize()方法

不必要 1 虛擬機已經執行過一次 2, 沒有覆蓋finalize()方法

有必要 執行此方法, 如果在執行完此方法後,此對象又與GCRoots建立起關係,那麼存活

垃圾回收算法

1 標記-清除 算法
2 複製算法 新生代算法 原因: 新生代98%對象都"朝生夕死", 又分爲三塊區域 Eden : From : To ==== 8 : 1 :1 , 空間利用率是90%, 進入老年代是15次
3 標記-整理算法 老年代算法 原因: 此區域對象存活率高, 不能採用複製算法
4 分代回收算法 就是劃分出老年代並且用什麼算法, 新生代用什麼算法

安全點 SafePoint 才能GC 因爲此時纔會有OopMap 信息 也就是需要GC的對象信息

垃圾回收器

是對垃圾回收算法的實現 ,有七個

Searial
ParNew 新生代
Paraller Scavenge 新
Searial Old 老
Parallel Old 老
CMS 最低停頓的收集器

G1 收集器

性能監控

jps 打印當前的所有JVM線程
jinfo 虛擬機配置信息
jstat 虛擬機快照
jstact 各方面運行的數據

一些可視化工具 jconsole

虛擬機類加載機制

把Class文件加載到內存中經過的檢驗,解析,和初始化過程

類加載器

確定一個類的唯一性, Class文件,JVM相同 但只要類加載機制不一樣, 類就不一樣

雙親委派模型

保證Java程序的穩定運行

啓動類加載器 BoorStrap ClassLoader lib目錄下
Extension lib\ext
Applicatiion 一般應用程序由次加載 CLASSPATH下
自定義

從下往上,在往下, 父類能加載,父類加載, 不能纔是子類加載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章