JVM學習筆記

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代碼
功能:

  1. 讀取dump內存文件,定位內存泄露位置
  2. 獲得大的對象,堆中數據

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內存模型)

在這裏插入圖片描述
在這裏插入圖片描述

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