JVM效能調優與實戰基礎理論篇 中

2022-09-21 07:03:09 字數 2160 閱讀 5907

我們所說的jvm記憶體模型是指執行時資料區,用new出來的物件放在堆中,如每個執行緒中區域性變數放在棧或叫虛擬機器棧中,下圖左邊區域部分為棧記憶體的結構。如main執行緒包含程式炯酸器、執行緒棧、本地方法棧三大部分,執行緒棧包含乙個或多個棧幀,虛擬機器都會給每個方法在各自的執行緒棧空間中開闢一塊棧幀空間來存放區域性變數表、運算元棧、動態鏈結、方法出口等。

根據jvm規範共分為虛擬機器棧,堆,方法區,程式計數器,本地方法棧五個部分

程式計數器:(program counter register)是一塊較小的記憶體空間,它的作用可以看做是當前執行緒所執行的位元組碼的行號指示器。

本地方法棧:與虛擬機器棧發揮的作用非常類似,他們之間的區別是虛擬機器棧為虛擬機器執行j**a方法服務,而本地方法棧則為虛擬機器使用到的native方法服務。與虛擬機器棧一樣,本地方法棧也會丟擲stackoverflowerror,outofmemorryerror異常。

堆:是j**a 虛擬機器所管理的記憶體中最大的一塊。j**a 堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立,幾乎所有物件和陣列都被分配到了堆記憶體中。堆被劃分為新生代和老年代,新生代又被進一步劃分為 eden 區和 survivor 區,最後 survivor 由 from survivor 和 to survivor 組成。隨著 j**a 版本的更新,其內容又有了一些新的變化:在 j**a6 版本中,永久代在非堆記憶體區;到了 j**a7 版本,永久代的靜態變數和執行時常量池被合併到了堆中;而到了 j**a8,永久代被 元空間 (處於本地記憶體)取代了。執行時常量池是位於元空間中,string的例項是放在堆記憶體中。

永久代它的上限是maxpermsize,預設是64m。

永久代大小是在啟動時固定好的——很難進行調優。-xx:maxpermsize,永久代最終被移除,執行時常量池存在於記憶體的元空間中字串常量移至j**a heap。permsize 和 maxpermsize 會被忽略並給出警告.

metaspace元空間

元空間替換永久代的原因

package cn.itxs.memorymodel;

public class math

public static void main(string args)

}

通過命令j**ap -c反彙編輸出更加可讀內容進行jvm底層的位元組碼分析 j**ap -c math.class > math.txt

每行位元組碼則由執行緒的程式計算器記錄執行的行號,反彙編後的是jvm執行指令,可以通過查詢jvm指令手冊了解其執行操作含義。比如第一行iconst_1對應jvm指令手冊為

0x04 iconst_1 將int型(1)推送至棧頂

package cn.itxs.memorymodel;

public class stackoverflowmain

public static void main(string args) catch (throwable t)}}

jvm預設每個執行緒棧大小為1m,可以通過-xss引數設定執行緒棧大大小

重新設定vmoption的引數為-xss128k,再次執行count的輸出為1920

前面類載入的連線中解析階段將符號引用轉換為直接引用, j**ap -v math.class > math-v.txt輸出更詳細的位元組碼執行資訊

在main方法中#4,對應的符號資訊查詢到常量池對應資訊如下,也即是math類的compute方法

package cn.itxs.memorymodel;

import j**a.util.arraylist;

import j**a.util.list;

import j**a.util.concurrent.timeunit;

public class heapmain }}

執行main方法,使用jdk調優工具jvisualvm,需要在jvisualvm需要先安裝好visual gc外掛程式。直接在命令列視窗輸入jvisualvm,然後再左側選擇測試j**a程式雙擊,點選右邊visual gc tab頁,可以觀察到動態堆記憶體變化過程。

**本人部落格** **it小神www.itxiaoshen.com

JVM效能調優

gc 優化的兩個目標 將進入老年代的物件數量降到最低 減少 full gc 的執行時間 gc 優化的基本原則是 將不同的 gc 引數應用到兩個及以上的伺服器上然後比較它們的效能,然後將那些被證明可以提高效能或減少 gc 執行時間的引數應用於最終的工作伺服器上。gc 優化需要考慮的 jvm 引數 型別...

Spark效能調優 JVM調優

通過一張圖讓你明白以下四個問題 1.jvm gc機制,堆記憶體的組成 2.spark的調優為什麼會和jvm的調優會有關聯?因為scala也是基於jvm執行的語言 3.spark中oom產生的原因 4.如何在jvm這個層面上來對spark進行調優 補充 spark程式執行時 jvm堆記憶體分配比例 r...

jvm 效能調優工具

工具 jpsjps l 主程序 jps m 執行傳入主類的引數 jps v 虛擬機器引數 jstat jstat gcutil pid 1000 1秒 jstat jinfo jmap jmap histo pid jmap dump formart b,file filepath pid jhat...