日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java虚拟机内存告警_Java虚拟机总结

發布時間:2025/3/21 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java虚拟机内存告警_Java虚拟机总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JVM體系四大塊:

類的加載

JVM內存結構

GC算法 垃圾回收

GC分析 性能調優

執行引擎

JVM架構圖

jvm.arch

一、類的加載機制

類的加載

類的加載,將class文件讀入方法區,然后在堆中創建java.lang.Class對象。類的加載最終是生成堆區中的Class對象。Class對象封裝類在方法區中的數據結構,并提供訪問方法區中的數據結構的接口。

類的生命周期

類的生命周期包括:加載、連接、初始化、使用和卸載,其中前三步是類的加載過程。

class.lifecycle

加載,查找并加載類的二進制數據,在Java堆中創建Class類的對象。

鏈接,

驗證,文件格式、元數據、字節碼、符號引用的驗證。

準備,為類的靜態變量分配內存,并初始化為默認值。

解析,把類中的符號引用轉換為直接引用。

初始化,為類的靜態變量賦予手動設置的初始值。

使用,new出對象,在程序中使用。

卸載,執行垃圾回收。

幾個小問題

1、JVM初始化步驟 ? 2、類初始化時機 ?3、哪幾種情況下,Java虛擬機將結束生命周期?

類加載器

啟動類加載器:Bootstrap ClassLoader,擴展類加載器:Extension ClassLoader,應用程序類加載器:Application ClassLoader。

類加載機制

全盤負責,當一個類加載器負責加載某個Class時,該Class所依賴的和引用的其他Class也由該類加載器負責載入,除非顯示使用另外一個類加載器來載入。

父類委托,先讓父類加載器嘗試加載該類,只有在父類加載器無法加載時才從自己的類路徑中加載該類。

緩存機制,緩存機制保證所有加載過的Class都會被緩存。當程序中需要使用某個Class時,類加載器先從緩存區尋找該Class,只有緩存區中不存在,系統才會讀取該類對應的二進制數據,并將其轉換成Class對象存入緩存區。這就是為什么修改了Class后,必須重啟JVM,程序的修改才會生效。

二、JVM內存結構

jvm內存結構

Java堆(Heap),只存放對象實例,幾乎所有的對象實例都在這里。

方法區(Method Area),存儲已被加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼。

程序計數器(Program Counter Register),當前線程所執行的字節碼的行號指示器。

JVM棧(JVM Stacks),其生命周期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:方法被執行的時候同時會創建一個棧幀(Stack Frame)用于存儲局部變量表、操作棧、動態鏈接、方法出口等信息。方法從被調用到執行完成的過程,就對應著棧幀在棧中從入棧到出棧的過程。

本地方法棧(Native Method Stacks),與虛擬機棧類似,虛擬機棧為虛擬機執行Java方法(字節碼)服務,而本地方法棧為虛擬機使用到的Native方法服務。

對象分配規則

對象優先分配在Eden區,如果Eden區沒有足夠空間時,執行minor GC。

大對象直接進入老年代。可以避免在eden區和兩個survivor區之間發生大量的內存拷貝(新生代采用復制算法收集內存)。

長期存活的對象進入老年代。虛擬機為對象定義了一個年齡計數器,如果對象經過了1次minor GC那么對象會進入survivor區,之后每經過一次minor GC那么對象的年齡加1,直到達到閥值,對象進入老年區。

動態判斷對象的年齡。如果survivor區中相同年齡的所有對象大小的總和大于survivor空間的一半,年齡大于或等于該年齡的對象直接進入老年代。

空間分配擔保。每次進行minor GC時,JVM計算survivor區移至老年區的對象的平均大小,如果這個值大于老年區的剩余值則進行一次full GC。如果小于檢查HandlePromotionFailure參數值,則只進行minor GC,否則進行Full GC。

三、GC算法 垃圾回收

1、對象存活判斷方式

引用計數:每個對象有一個引用計數屬性,新增一個引用時計數加1,引用釋放時減1,計數為0時可以回收。此方法簡單,但無法解決對象循環引用的問題。

可達性分析:從GC roots向下搜索,搜索所走過的路徑稱為引用鏈。當對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的,不可達對象。

GC roots包括:虛擬機棧中引用的對象。本地方法棧中JNI引用的對象。 方法區中類靜態屬性、常量引用的對象。

2、GC算法

標記 -清除(Mark-Sweep)算法,分為“標記”和“清除”兩個階段:首先標記出所有需要回收的對象,在標記完成后回收所有被標記的對象。

復制算法(Copying),將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活的對象復制到另外一塊上,然后再把已使用過的內存空間一次清理掉。

標記-整理算法,標記過程與“標記-清除”算法一樣,但后續步驟是讓所有存活的對象向一端移動,然后清理掉端邊界以外的內存。

分代收集算法(Generational Collection),把堆分為新生代和老年代,根據各年代的特點采用適當的收集算法。(**常用)

分區

3、垃圾回收器

Serial回收器,是最古老,最穩定以及效率高的收集器,可能會產生較長的停頓,只能用一個線程回收。

ParNew回收器,ParNew收集器是Serial收集器的多線程版本。

Parallel Scavenge回收器,類似ParNew收集器,Parallel收集器更關注系統的吞吐量。

CMS(Concurrent Mark Sweep)收集器,以獲取最短回收停頓時間為目標的收集器。

G1(Garbage-First)收集器,是面向服務器的垃圾收集器,主要針對配備多顆處理器及大容量內存的機器。以極高概率滿足GC停頓時間的同時,還具備高吞吐量。

三、GC分析 性能調優

1、GC日志分析

[GC [: -> , secs] -> , secs] [Times: user=secs sys=secs, real=secs]

GC收集器的名稱

新生代在GC前占用的內存

新生代在GC后占用的內存

新生代局部收集時jvm暫停處理的時間

JVM Heap 在GC前占用的內存

JVM Heap 在GC后占用的內存

GC過程中jvm暫停處理的總時間

用戶時間

系統時間

實際時間

4.231: [GC 4.231: [DefNew: 4928K->512K(4928K), 0.0044047 secs] 6835K->3468K(15872K), 0.0045291secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

4.445: [Full GC (System) 4.445: [Tenured: 2956K->3043K(10944K), 0.1869806 secs] 4034K->3043K(15872K), [Perm : 3400K->3400K(12288K)], 0.1870847secs] [Times: user=0.05 sys=0.00, real=0.19 secs]

最前面的數字 4.231 和 4.445 代表虛擬機啟動以來的秒數。

接下來的 [DefNew , [Tenured , [Perm 表示 GC 發生的區域,區域的名稱與使用的 GC 收集器相關。 Serial 收集器中新生代名為 "Default New Generation",顯示的名字為 "[DefNew"。ParNew收集器顯示的是 "[ParNew", “Parallel New Generation”。 Parallel Scavenge 收集器新生代名為 "PSYoungGen"。年老代和永久代名稱也都由收集器決定。

方括號內部顯示的 “4928K->512K(4928K)” 表示 “GC 前該區域已使用容量 -> 垃圾回收后該區域已使用容量 (該區域內存總容量) ”。

再往后的 “0.0044047 secs” 表示該區域GC所用時間,單位是秒。

再往后的 “6835K->3468K(15872K)” 表示 “GC 前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆總容量)”。

再往后的 “0.0045291 secs” 是Java堆GC所用的總時間。

最后的 “[Times: user=0.00 sys=0.00, real=0.00 secs]” 分別代表用戶態消耗的CPU時間、內核態消耗的CPU時間和操作從開始到結束所經過的墻鐘時間。

墻鐘時間包括各種非運算的等待耗時,如IO等待、線程阻塞。CPU時間不包括等待時間,當系統有多核時,多線程操作會疊加這些CPU時間,所以user或sys時間會超過real時間。

2、調優命令

JDK監控和故障處理命令

jps,顯示指定系統內所有的HotSpot虛擬機進程。

jstat,用于監視虛擬機運行時狀態信息,可以顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。

jmap,生成heap dump文件。

jhat,與jmap搭配使用,分析jmap生成的dump,jhat內置了一個微型的HTTP/HTML服務器,生成dump的分析結果后,可以在瀏覽器中查看。

jstack,生成java虛擬機當前時刻的線程快照。

jinfo,實時查看和調整虛擬機運行參數。

3、調優工具

常用調優工具分為兩類,jdk自帶監控工具:jconsole和jvisualvm;第三方有:MAT(Memory Analyzer Tool)。

jconsole,是從java5開始,JDK自帶的java監控和管理控制臺,用于對JVM中內存,線程和類等的監控。

jvisualvm,jdk自帶全能工具,可以分析內存快照、線程快照;監控內存變化、GC變化等。

MAT,Memory Analyzer Tool,基于Eclipse的內存分析工具,是一個快速、功能豐富的Java heap分析工具,它可以幫助我們查找內存泄漏和減少內存消耗。

四、執行引擎

分配給運行時數據區的字節碼將由執行引擎執行,執行引擎讀取字節碼并逐個執行。

(1) 解釋器:解釋器更快地解釋字節碼,但執行緩慢。解釋器的缺點是當一個方法被調用多次時,每次都需要一個新的解釋。

(2) JIT編譯器:JIT編譯器消除了解釋器的缺點。執行引擎將在轉換字節碼時使用解釋器的幫助,但是當它發現重復的代碼時,將使用JIT編譯器,編譯整個字節碼并將其更改為本地代碼。這個本地代碼將直接用于重復的方法調用,這提高了系統的性能。JIT的構成組件為:

中間代碼生成器(Intermediate Code Generator):生成中間代碼。

代碼優化器(Code Optimizer):優化上面生成的中間代碼。

目標代碼生成器(Target Code Generator):生成機器代碼或本地代碼。

分析器(Profiler):查找熱點,即該方法是否被多次調用。

(3) 垃圾收集器(Garbage Collector):收集和刪除未引用的對象。可以通過調用“System.gc()”觸發垃圾收集,但不保證立即執行。

Java本機接口(JNI):JNI與本機方法庫進行交互,并提供執行引擎所需的本機庫。

本地方法庫(Native Method Libraries):它是執行引擎所需的本機庫的集合。

參考

總結

以上是生活随笔為你收集整理的java虚拟机内存告警_Java虚拟机总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。