JVM
-
JVM的位置
作業系統的堆中,不能與硬體直接互動,需透過作業系統互動
-
JVM體系結構
-
類載入器
用於載入class檔案
三種類載入器
1.啟動類載入器Bootstarp ClassLoader
2.擴充類載入器Extension ClassLoader
3.應用程式類載入器Application ClassLoader
-
雙親委派機制
1.類載入器收到類載入請求
2.將這個請求委託個父類載入器,一直向上委託,直到啟動類(根類)載入器
(Application ==> Extension ==> Bootstrap)
3.類載入器檢查是否能載入當前類,能載入就結束,使用當前載入器,否則丟擲異常通知子類載入器
4.重複操作3
(Bootstrap ==> Extension ==> Application ==> ClassNotFound)
-
沙箱安全機制
主要限制系統資源的訪問,引入域的概念,不同的域管理不同的系統資源許可權
沙箱主要組成部件:
1.位元組碼校驗器:確保java語言規範
2.類裝載器:雙親委派機制,保護善意程式碼
3.存取控制器:控制核心API對作業系統的存取許可權
4.安全管理器
5.安全軟體包:使用者自主增加安全特性,包括:
·安全提供者
·訊息摘要
·數字簽名
·加密
·鑑別
-
Native關鍵字
·java無法執行,要呼叫底層的C語言庫
·進入本地方法棧,呼叫JNI(本地方法介面)
·記憶體區域中專門開闢了標記區域Native Method Stack,記錄native方法。
·JNI的作用:擴充java的使用,融合不同程式語言!
-
PC暫存器
相當於一個指標,儲存指令指向下一個指令的地址
每個執行緒都有自己的程式計數器pc,執行緒私有的,生命週期和執行緒一致
-
方法區 Method Area
被所有執行緒共享,是所有定義的方法的資訊都儲存在這個區域
靜態變數static、常量final、類資訊(介面定義和構造方法)Class、常量池存在方法區,例項變數存在堆中
-
棧 Stack
主管程式執行,生命週期和執行緒一致,不存在垃圾回收問題
每個方法執行時都會建立一個棧幀
儲存八大基本型別、引用物件和例項方法
先進後出
-
三種JVM
HotSpot-----sun公司
JRockit-------BEA
J9 VM--------IBM
-
堆 Heap
一個JVM只有一個堆,堆記憶體大小是可調節的
類載入器讀取完類檔案後,堆中存放所有應用型別的真實物件,類,方法,常量,變數
堆記憶體可分為三個區域:
新生區(伊甸園Eden Space、倖存區Survivor Space):
伊甸園Eden Space:物件被建立首先被放置的區域,進行輕量級的垃圾回收後未被清理的物件會進入倖存區Survivor Space。
倖存區Survivor Space:有兩個,To Survivor Space和From Survivor Space,大小一致,用於儲存在eden space記憶體區域中經過垃圾回收後沒有被回收的物件。
執行垃圾回收的時候Eden區域不能被回收的物件被放入到空的survivor(也就是To Survivor,同時Eden區域的記憶體會在垃圾回收的過程中全部釋放),另一個survivor(即From Survivor)裡不能被回收的物件也會被放入這個survivor(即To Survivor),然後To Survivor 和 From Survivor的標記會互換,始終保證一個survivor是空的。 Mintor GC/Young GC
老年區
用於於存放新生區中經過多次垃圾回收仍然存活的物件,也有可能是新生區分配不了記憶體的大物件會直接進入老年區。Major GC/Full GC
永久區
存放JDK自帶的Class物件,Interface後設資料,關閉JVM就會釋放記憶體
-
堆記憶體調優
OOM: java.lang.OutOfMemoryError: Java heap space
嘗試擴大堆記憶體,透過JProffiler工具分析OOM原因
-Xms:設定jvm初始化大小
-Xmx:設定jvm最大記憶體大小
-Xmn:設定新生區大小
-Xss:設定每個執行緒堆疊大小
-XX:+PrintGCDetails //列印GC垃圾回收資訊
-XX:+HeapDumpOnOutOfMemoryError //OOM Dump
-
GC
作用區域:方法區和堆
常用演算法
引用計數法:給每個物件分配一個計數器,記錄使用次數
複製演算法:年輕代中的倖存區
好處:沒有記憶體碎片
壞處:浪費了記憶體空間
最佳使用環境:物件存活度低
標記清除:對活著的物件進行標記,再對未標記的物件進行刪除
優點:不需要額外空間
缺點:浪費時間,會引數記憶體碎片
標記壓縮::標記清除後,向一段移動存活的物件
GC分代收集演算法:新生代用複製演算法,老年代用標記清除壓縮
-
JMM (Java Memory Modal------java記憶體模型)
一種跨平臺開發規範
三大特效:原子性、可見性、有序性