JVM运行参数_JVM内存模型_常用内存分析工具
JVM運行參數
常見標準參數
- -showversion: 顯示當前JVM版本等信息
- -D設置系統屬性參數:
在IDEA的運行配置環境中添加VM options
運行結果: hello
- server, client參數
常見-X非標準參數
- -Xint: 強制JVM執行所有字節碼, 運行速度降低較為嚴重
- -Xcomp: 與Xint相反, JVM第一次使用把所有的字節碼編譯生成本地代碼, 提高代碼優化程度(-Xcomp沒有讓JVM啟用JIT編譯器全部功能, JIT可以自行決定哪些代碼編譯, 哪些代碼不編譯), 也存在運行速度下降, 相比于Xint, -Xcomp較好
- -Xmixed: 解釋模式與編譯模式的混合, 讓JVM自行決定使用哪種方式進行編譯
常見-XX非標準參數(常用于JVM調優/debug操作)
boolean類型: -XX:[+-]<name> +表示啟用屬性, -表示禁用屬性例: -XX:+DisableExplicitGC 禁止手動調用GC 非boolean類型:-XX:<name>=<value> 設置name值為value例: -XX:NewRatio=1 設置新老代比值- -Xms: 設置jvm的堆內存大小, 例: -Xms512m 等價于 -XX: InitialHeapSize=512m
- -Xmx: 設置堆內存最大值, 例: -Xmx2048m 等價于 -XX: MaxHeapSize=2048m
查看JVM運行參數
- 運行時打印參數: -XX:+PrintFlagsFinal
查詢打印的運行參數如下:
根據上圖, 等號后面是數字 => 非boolean類型-XX參數; 等號后面是true/false => boolean類型-XX:參數; =, :=代表默認值與被修改的值 - 查看正在運行的JVM參數: jinfo -flags 進程端口; 查看指定屬性的值: jinfo -flags 屬性 進程端口
JVM內存模型
1.7版本與1.8版本內存模型
各區域說明
Young: 年輕代=> 包含Eden, 2*Survivor, 其中一個Survivor用于存放GC時存活的對象, 經歷幾次垃圾回收, Survivor中存活對象轉移到Tenured
Tenured: 老年代存放生命周期長的對象, 對象在Young中區域中, 經歷多次GC都還存活, 才能轉移到Tenured, 當生產一個大對象時, 會直接移動到老年代中
Perm: 1.7版本, 保存class, method, field對象. 很少出現OOM
MetaspaceVM: 1.8版本, 使用元數據空間替換Perm區, 存放位置放置在直接內存中, 不再占用虛擬機空間
Virtual: 最大內存與初始內存的差值
棄用1.7Perm永久區說明
根據官方說明: 融合HotSpot, JRockit(不存在永久代), 且永久代容易出現OOM
jstat使用
jstat: 用于查詢堆內存各部分使用情況, 加載類數量
查看當前應用編譯情況
查看當前應用GC情況
動態查看應用運行情況: jstat -gc 13880 1000 5 => 每隔1s打印一次, 總共打印5次
jmap使用
jmap: 相比于jstat, jmap能獲取更加詳細的內容
查看當前應用堆情況:
查看應用存活對象:
jmap -histo 105772 代表查看所有對象, 包括死亡的對象
將內存使用情況dump到文件中, jhat對dump文件分析
jmap -dump:format=b, file=dumpFileName 應用端口
jhat -port 端口 dump文件
可以對上面的內容進行檢查, 快速定位分析問題, 哪個地方有大對象產生, 那個地方的內存分配不合理等情況
模擬內存溢出, 使用Eclipse Memory Analyzer進行分析
import java.util.ArrayList; import java.util.UUID;/*** 內存溢出測試* @author regotto*/ public class JvmTestOutOfMemarry {public static void main(String[] args) {ArrayList<String> strings = new ArrayList<String>();for (int i = 0; i < 10000000; i++) {String s = "";for (int j = 0; j < 10000; j++) {s += UUID.randomUUID().toString();}strings.add(s);}System.out.println("Ok");}}
-XX:HeapDumpOnOutOfMemoryError: 設置程序內存溢出時, 自動生成dump文件
將在項目下生成的java_pid175420.hprof導入Eclipse Memory Analyzer工具
查看分析報告: 在main函數中, 存在本地變量占用73.09%的內存空間, 點擊see stacktrace查看線程棧調用情況, 如下圖, 可以看出StringBuilder.append導致內存溢出情況
jstack查看jvm線程情況
jstack pid
Java VisualVM
使用方式 => 自行百度
注: 監控遠程服務器上的程序, 需要配置JMX才能進行JMX連接
總結
以上是生活随笔為你收集整理的JVM运行参数_JVM内存模型_常用内存分析工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vant组件搜索并选择_Vant Wea
- 下一篇: 要多大内存才满足_佛龛的尺寸要多大?