前言
java虛擬機(java virtual machine,JVM),一種能夠運行java位元組碼的虛擬機,作為一種編程語言的虛擬機,實際上
不只是專用于Java語言,只要生成的編譯檔案匹配JVM對加載編譯檔案格式要求,任何語言都可以由JVM編譯運行,
比如kotlin、scala等, jvm有很多,不只是Hotspot,還有JRockit、J9等等
這里再給大家免費分享一波Java架構師學習資料,針對JAVA底層的架構技術
資料領取方式:點擊這里【暗號:CSDN】

JVM的基本結構
JVM由三個主要的子系統構成
- 類加載子系統
- 運行時資料區(記憶體結構)
- 執行引擎

運行時資料區(記憶體結構)
1.方法區(Method Area)
類的所有欄位和方法位元組碼,以及一些特殊方法如建構式,介面代碼也在這里定義,簡單來說,所有定義的方法的資訊都保存在該區域,靜態變數+常量+類資訊(構造方法/介面定義)+運行時常量池都存在方法區中,雖然Java虛擬機規范把方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆),目的應該是為了和Java的堆區分開
2.堆(Heap)
虛擬機啟動時自動分配創建,用于存放物件的實體,幾乎所有物件都在堆上分配記憶體,當物件無法在該空間申請到記憶體是將拋出OutOfMemoryError例外,同時也是垃圾收集器管理的主要區域,

2.1 新生代(Young Generation)
類出生、成長、消亡的區域,一個類在這里產生,應用,最后被垃圾回收器收集,
結束生命,
新生代分為兩部分:伊甸區(Eden space)和幸存者區(Survivor space),所有的類都是在伊甸區被new出來的,
幸存區又分為From和To區,當Eden區的空間用完是,程式又需要創建物件,JVM的垃圾回收器將Eden區進行垃圾回收(Minor GC),將Eden區中的不再被其它物件應用的物件進行銷毀,然后將Eden區中剩余的物件移到FromSurvivor區,若From Survivor區也滿了,再對該區進行垃圾回收,然后移動到To Survivor區,
2.2 老年代(Old Generation)
新生代經過多次GC仍然存貨的物件移動到老年區,若老年代也滿了,這時候將發生Major GC(也可以叫Full GC),
進行老年區的記憶體清理,若老年區執行了Full GC之后發現依然無法進行物件的保存,就會拋出
OOM(OutOfMemoryError)例外
2.3 元空間(Meta Space)
在JDK1.8之后,元空間替代了永久代,它是對JVM規范中方法區的實作,區別在于元資料區不在虛擬機當中,而是用的本地記憶體,永久代在虛擬機當中,永久代邏輯結構上也屬于堆,但是物理上不屬于,
為什么移除了永久代?
參考官方解釋http://openjdk.java.net/jeps/122
大概意思是移除永久代是為融合HotSpot與 JRockit而做出的努力,因為JRockit沒有永久代,不需要配置永久代,

3.堆疊(Stack)
Java執行緒執行方法的記憶體模型,一個執行緒對應一個堆疊,每個方法在執行的同時都會創建一個堆疊幀(用于存盤區域變數
表,運算元堆疊,動態鏈接,方法出口等資訊)不存在垃圾回收問題,只要執行緒一結束該堆疊就釋放,生命周期和執行緒一
致
4.本地方法堆疊(Native Method Stack)
和堆疊作用很相似,區別不過是Java堆疊為JVM執行Java方法服務,而本地方法堆疊為JVM執行native方法服務,登記native
方法,在Execution Engine執行時加載本地方法庫
5.程式計數器(Program Counter Register)
就是一個指標,指向方法區中的方法位元組碼(用來存盤指向嚇一跳指令的地址,也即將要執行的指令代碼),由執行引擎讀取下一條指令,是一個非常小的記憶體空間,幾乎可以忽略不計
JDK性能調優監控工具
Jinfo
查看正在運行的Java程式的擴展引數
查看JVM的引數

查看java系統屬性
等同于System.getProperties()
Jstat
jstat命令可以查看堆記憶體各部分的使用量,以及加載類的數量,命令格式:
jstat [-命令選項] [vmid] [間隔時間/毫秒] [查詢次數]
Jmap
可以用來查看記憶體資訊
堆的物件統計
jmap -histo 7824 > xxx.txt
如圖:

- Num:序號
- Instances:實體數量
- Bytes:占用空間大小
- Class Name:類名
堆資訊

堆記憶體dump

jmap -dump:format=b,file=temp.hprof
也可以在設定記憶體溢位的時候自動匯出dump檔案(專案記憶體很大的時候,可能會導不出來)
1.-XX:+HeapDumpOnOutOfMemoryError
2.-XX:HeapDumpPath=輸出路徑
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -
XX:HeapDumpPath=d:\oomdump.dump

可以使用jvisualvm命令工具匯入檔案分析

Jstack
jstack用于生成java虛擬機當前時刻的執行緒快照,

最后再為大家分享一波底層架構師資料
資料領取方式:點擊這里【暗號:CSDN】


資料領取方式:點擊這里【暗號:CSDN】

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/204113.html
標籤:java
