1.JVM的位置
2.JVM體系結構
3.類加載器作用:加載Class文件
根加載器Root(最終執行)擴展加載器EXC應用加載器APP自定義加載器
4.雙親委派機制
1 類模板通過類裝載器,然後類加載器收到類加載的請求,
2 將這個請求向上委託給父類加載器取完成,一直向上委託,直到啓動類加載器
3 啓動類加載器檢查是否能夠加載當前這個類,能加載就結束,使用當前加載器,否則,拋出異常,通知子類加載器
4 重複步驟3
5.組成沙箱的基本條件
字節碼驗證器,確保語言規範類
加載器防止惡意代碼(雙親委派機制),防止篡改類,將代碼歸入保護域
調用遠程代碼不安全,後來jdk1.0加入驗證
再後來jdk給代碼分組調用,每個分組加上權限
再到後面jdk1.6加入了保護域
6.native
帶了native的關鍵字說明超出了java的作用範圍,需要進入本地方法棧然後去找JNI本地方法接口,
JNI是爲了拓展JAVA的使用,融合不同的編程語言,
因爲在那時候C和C++的風頭很大,java爲了能調用他們的方法,
開闢了一塊標記區域,Nativemethod Stack,
在最終執行的時候,加載本地方法庫中的方法通過本地方法接口
7.方法區
方法區裏面有常量池比如類模板加載進來,
靜態變量還有方法都會進入方法區而對象則會進入堆,
類的對象引用進入棧,按照引用去堆裏找數據,如果要拿字段的值,常量池優先
8.棧
先進後出,後進先出,棧:棧內存,主管程序的運行,生命週期和線程同步棧默認程序執行完,自動釋放內存,不存在垃圾回收
棧幀:
棧滿了 StackOverflowError 棧的引用可以有 8大類型+對象引用+實例方法
9.程序計數器
就是計數,會自動增加一塊臨時空間計算增長,計算完馬上釋放,佔用少
10.JVM
三種常用JVMBEA JRockitIBM J9 VM我們學習的是HotSpot,,
11.堆
一個JVM一個堆 新生區 老年區 永久區jdk1.5分爲這三個區,1.6永久區慢慢變小,1.7後沒有永久區了,改爲元空間常量池也從方法區到退化,到元空間
而且物理上不存在,邏輯上存在
當新生區滿會發生輕GC清理內存,活下來的去養老區,當養老區滿的時候會觸發重GC,然後活下來的去永久存儲區,都滿了就會出現OOM
OOM解決辦法: 1.提高內存上限 2.內存快照工具,MAT,Jprofiler,Debug代碼
功能:
- 讀取dump內存文件,定位內存泄露位置
- 獲得大的對象,堆中數據
11.堆內存調優
Xms8m Xmm8m -XX:+PrintGCDetails
Xms 設置初始化內存分配大小 1/4
Xmx 設置最大分配內存 1/64
默認情況分配內存是電腦的1/4,初始化的內存是1/64
//dump內存文件
Xms8m Xmm8m -XX:+HeapDumpOnOutOfMemoryError
12.GC:垃圾回收
12.GC常用算法
引用計數法
對象沒有引用就會被清除,計數器作爲標記
複製算法
倖存區不停交換複製,留一個空的倖存區每一個對象經歷了15次輕GC不死就會到老年區
好處:沒有內存碎片
壞處:浪費了內存空間,多了一般空間永遠是空to
極端情況:假設對象百分百存活整個考進幸存區to,工程量大
最佳使用場景:對象存活度較低的時候,即新生區
標記清除算法
優點:不需要額外空間
缺點:兩次掃描,嚴重浪費時間,會產生內存碎片
標記壓縮:再優化
標記清除壓縮
先標記清除幾次,再進 行壓縮
13.總結
14.JMM(java內存模型)