jvm調優及原理

1.java能在跨平臺使用

主要是因爲我們將.java 源文件通過jvm編譯爲.class文件 在運行的時候java虛擬機會一行一行的執行字節碼文件,操作系統是不認識java的  所以對於不同的平臺有不同的java虛擬機 編譯爲不同操作系統的字節碼文件

2.java 虛擬機的執行過程

先說幾個概念

類裝載器(ClassLoader):主要負責加載class文件

堆:它是Java虛擬機用來存儲對象實例的,比我們在開發過程使用的new對象,只要通過new創建的對象的內存的對象都在堆分配,注意一點的是堆中的對象內存需要等待垃圾器(GC)進行回收,也是Java虛擬機共享區。

棧:棧內存,負責Java程序的運行,它是在線程創建時創建的,所以生命週期也是和線程生命週期一致,同時消亡,線程結束了棧也就釋放,特別提醒的是棧不存在垃圾回收的問題,因爲線程結束棧就是釋放了。平時我們寫的類變量、引用類型變量、實例方法等等都是在函數的棧內存分配好。(棧幀 包括 局部變量,操作數棧,動態鏈接(符號引用轉爲直接引用),方法出口)(一個方法是一個棧幀)

本地方法區:主要作用是登記native方法,然後在execution engine執行的時候加載本地方法庫(例如new thread)

方法區(元空間):線程共享的,誰都可以共享使用,我們通常用來保存裝載類的元結構信息。(就是加載的類放到方法區裏,字節碼相關信息)(常量,靜態變量,類元信息(有什麼方法,名稱,修飾符))

 

程序計數器:是指方法區中的方法字節碼由引擎讀取下一條指令,它是一個非常小的內存空間。爲什麼有這種東西呢,大家都知道每個線程都是有一個程序計數器的,是線程私有的,相當一個指針。

堆和棧的關係  棧中new對象的引用指向堆

方法區與堆的關係(對象靜態變量的)

jvm編譯爲.class字節碼文件之後  通過類裝載子系統 裝載到運行時數據區中  然後通過字節碼執行引擎執行

 

jvm 垃圾回收

jvm內存區域分爲 新生代和老年代 新生代1/3 老年代2/3  新生代分爲 eden區和 survivor區  eden8/10 survivor2/10

survivor 分爲form to 各佔1/2

gc分爲 minor gc與full gc

minor gc 有引用的放到form區 無引用的回收掉(引用指的是gc root 根節點)

放到form區後 分帶年齡加1   當在此minor gc 的時候同時會回收form區(並清空) 放入to區 分帶年齡繼續加一

在form區和to區輪詢 在minor gc執行15次並沒有回收  直接遷移到老年代(例如線程池,連接池,緩存數據,靜態變量)

當老年代被放滿的時候執行full 對整個對執行垃圾回收

當full gc 和minor gc 回收時會停止用戶的應用線程 專心執行垃圾回收

調優

調優主要是 減少垃圾回收的次數 減少full gc的執行時間 大量的fullgc 就是元空間滿了  把元空間的內容調大點

form 和to 區的

 

可以利用gc 日誌執行調優,調整各區的內存分配

 

記錄在JVM參數中一定要設置-XX:+HeapDumpAfterFullGC和-XX:+HeapDumpOnOutOfMemoryError兩個參數,可以在發送FGC和OOM的時候將當時的Java堆情況

 

 

 

 

 

 

 

 

 

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