JVM系列整體欄目
內(nèi)容 | 鏈接地址 |
---|---|
【一】初識(shí)虛擬機(jī)與java虛擬機(jī) | https://blog.csdn.net/zhenghuishengq/article/details/129544460 |
【二】jvm的類加載子系統(tǒng)以及jclasslib的基本使用 | https://blog.csdn.net/zhenghuishengq/article/details/129610963 |
【三】運(yùn)行時(shí)私有區(qū)域之虛擬機(jī)棧、程序計(jì)數(shù)器、本地方法棧 | https://blog.csdn.net/zhenghuishengq/article/details/129684076 |
【四】運(yùn)行時(shí)數(shù)據(jù)區(qū)共享區(qū)域之堆、逃逸分析 | https://blog.csdn.net/zhenghuishengq/article/details/129796509 |
【五】運(yùn)行時(shí)數(shù)據(jù)區(qū)共享區(qū)域之方法區(qū)、常量池 | https://blog.csdn.net/zhenghuishengq/article/details/129958466 |
【六】對(duì)象實(shí)例化、內(nèi)存布局和訪問定位 | https://blog.csdn.net/zhenghuishengq/article/details/130057210 |
【七】執(zhí)行引擎,解釋器、JIT即時(shí)編譯器 | https://blog.csdn.net/zhenghuishengq/article/details/130088553 |
【八】精通String字符串底層機(jī)制 | https://blog.csdn.net/zhenghuishengq/article/details/130154453 |
【九】垃圾回收底層原理和算法以及JProfiler的基本使用 | https://blog.csdn.net/zhenghuishengq/article/details/130261481 |
【十】垃圾回收器的種類以及內(nèi)部的執(zhí)行原理 | https://blog.csdn.net/zhenghuishengq/article/details/130261481 |
【十一】jvm性能調(diào)優(yōu)篇之命令行工具的基本使用 | https://blog.csdn.net/zhenghuishengq/article/details/130641456 |
【十二】jvm性能調(diào)優(yōu)篇之GUI工具的基本使用 | https://blog.csdn.net/zhenghuishengq/article/details/130745931 |
【十三】jvm性能調(diào)優(yōu)篇之參數(shù)設(shè)置以及日志分析 | https://blog.csdn.net/zhenghuishengq/article/details/130802703 |
一,JVM參數(shù)設(shè)置以及日志分析
1,JVM的參數(shù)設(shè)置
1.1,標(biāo)準(zhǔn)參數(shù)選項(xiàng)
特點(diǎn)就是比較穩(wěn)定,后續(xù)的版本也不會(huì)變化,以-開頭??梢源蜷_cmd可執(zhí)行命令,輸入java -help
,就可以查看對(duì)應(yīng)的命令,如可以通過-server和-client模式設(shè)置是客戶端模式還是服務(wù)端模式
java -help
1.2,-X參數(shù)選項(xiàng)
非標(biāo)準(zhǔn)化參數(shù),功能相對(duì)穩(wěn)定,后續(xù)版本可能會(huì)發(fā)生變動(dòng),以-X開頭。可以輸入java -X
,就可以查看到對(duì)應(yīng)的命令。如可以通過這個(gè)-Xmixed來作為執(zhí)行引擎的混合模式,解釋器+編譯器。
java -X
還有一些如設(shè)置堆的初始大小,最大大小以及設(shè)置線程的大小等
-Xms10m -Xmx10m -Xss10m
1.3,-XX參數(shù)類型
也是非標(biāo)準(zhǔn)化參數(shù),使用的自多的參數(shù)類型,功能相對(duì)不穩(wěn)定,以-XX開頭,一般用于開發(fā)和調(diào)試JVM。
又可以對(duì)這些指令進(jìn)行分類,分成boolean類型和非boolean類型。boolean類型的通過+、-
加或者減來啟用或者禁用某個(gè)屬性,因?yàn)橛械闹噶钍悄J(rèn)開啟或者默認(rèn)關(guān)閉的。如下面的一些命令:
-XX:+UseParallelGc 選擇垃圾收集器為并行垃圾收集器
-XX:+UseG1GC 啟用G1收集器
-XX:+UseAdaptiveSizePolicy 自動(dòng)選擇新生代大小和相應(yīng)的s區(qū)的比例
-XX:+PrintFlagsFinal 輸出所有參數(shù)的名稱和默認(rèn)值
非boolean類型的如下
//key/value類型
-XX:NewSize=1024M 新生代初始大小
-XX:MaxGCPauseMillis=500 設(shè)置GC停頓時(shí)間:500ms
-XX:GCTimeRatio=19 設(shè)置吞吐量
-XX:NewRatio=2 設(shè)置新生代和老年代比例
2,添加JVM參數(shù)
如在運(yùn)行一個(gè)jar包,可以設(shè)置堆的大小,gc的間隔以及打印日志等
java -Xms1024m -Xmx1024m -XX:PrintGcDetails -XX:+PrintGcTimeStamps -jar xx.jar
3,常用的JVM的參數(shù)選項(xiàng)
打印的相關(guān)參數(shù)有
-XX:PrintFlagsFinal 表示打印出XX選項(xiàng)在運(yùn)行時(shí)程序生效的值
-XX:PrintFlagsInitial 表示打印出XX選項(xiàng)的默認(rèn)值
-XX:PrintVMOptions 打印JVM參數(shù)
棧的相關(guān)參數(shù)有
-Xss1m 設(shè)置每個(gè)線程棧的大小為1m
堆內(nèi)存的相關(guān)參數(shù)
-Xms1024m -Xmx1024m 設(shè)置堆的初始大小和最大大小都是1024m
-Xmn2g 設(shè)置的是年輕代的大小
-XX:NewRatio=4 設(shè)置老年代和新生代的比例,默認(rèn)為2
-XX:NewSize=1g 設(shè)置年輕代的初始大小為1g
-XX:NewMaxSize=1g 設(shè)置年輕代的最大大小為1g
在堆中還有一個(gè)重要的參數(shù)設(shè)置,這個(gè)自動(dòng)選擇各區(qū)比例是開啟的,所有有時(shí)查看到的eden區(qū)和s區(qū)的比例有時(shí)為6:1,這個(gè)比例是動(dòng)態(tài)調(diào)整的,如果想讓他的值為默認(rèn)值8:1,就得將這個(gè)-XX:SurvivorRatio=8
開啟
-XX:SurvivorRatio=8 設(shè)置Eden區(qū)和s區(qū)的比例,默認(rèn)為8
-XX:+UseAdaptiveSizePolicy 自動(dòng)選擇各區(qū)比例
方法區(qū)的相關(guān)參數(shù),由于jdk8以及之后實(shí)現(xiàn)這個(gè)方法區(qū)的方式都是元空間,因此只談元空間的參數(shù)設(shè)置
-XX:MetaspaceSize 初始空間
-XX:MaxMetaspaceSize=8 最大空間
-XX:+UseCompressedOops 壓縮對(duì)象 指針
-XX:CompressedClassSpaceSize 設(shè)置類的元空間大小,默認(rèn)是1G
OutofMemory相關(guān)參數(shù)
-XX:+HeapDumpOnOutOfMemory 表示出現(xiàn)OOM時(shí),生成一個(gè)堆的dump文件
-XX:HeapDumpBeforeFullGc 表示出現(xiàn)這個(gè)FullGc之前,生成heap的存儲(chǔ)文件
-XX:HeapDumpPath=<path> 指定heap轉(zhuǎn)存儲(chǔ)文件的存儲(chǔ)路徑
-XX:OnOutOfMemoryError 指定一個(gè)可行性的程序或者腳本
垃圾收集相關(guān)選項(xiàng)
-XX:+UseSerialGC 指定新生代和老年代使用serial回收器
-XX:+UseParNewGC 手動(dòng)指定ParNewGC作為新生代的回收器
-XX:ParallelGCThreads 限制線程數(shù)量,默認(rèn)開啟和CPU相同的線程數(shù)
-XX:+UseParallelGC 手動(dòng)指定并使用Parallel作為并行收集器
-XX:+UseParallelOldGC 手動(dòng)指定老年代都是使用并行回收器
-XX:GCTimeRatio 垃圾收集時(shí)間占總時(shí)間比例
-XX:+UseAdapaiveSizePolicy 自適應(yīng)調(diào)節(jié)策略
-XX:+UseConcMarkSweepGC 手動(dòng)指定CMS作為垃圾回收器
-XX:ParallelCMSThreads 設(shè)置CMS的線程數(shù)量
-XX:MaxGCPauseMillis 設(shè)置期望值達(dá)到的最大GC停頓時(shí)間
-XX:ParallelGCThread 設(shè)置STW時(shí)GC線程數(shù)的值,最多設(shè)置為8
-XX:UseG1GC 手動(dòng)指定使用G1收集器執(zhí)行內(nèi)存回收任務(wù)
-XX:G1HeapRegionSize 設(shè)置每個(gè)region的分區(qū)大小
-XX:ConcGCThreads 設(shè)置并發(fā)標(biāo)記的線程數(shù)
GC日志相關(guān)選項(xiàng)
-verbose:gc 輸出GC日志信息
-XX:+PrintGC 輸出GC日志信息
-XX:+PrintGCDetails 發(fā)生垃圾回收時(shí)打印內(nèi)存回收的詳細(xì)信息
-XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息
-XX:PrintGCTimeStamps 輸出gc打印時(shí)間戳信息
-Xloggc <path> 將日志文件保存到指定的path路徑下
其他參數(shù)
-XX:+DisableExplicitGC 禁用虛擬機(jī)執(zhí)行System.gc()
-XX:+UseCodeCacheFlushing 清理一些編譯的代碼
-XX:+DoEscapeAnalysis 開啟逃逸分析
-XX:+UseBiasedLocking 開啟偏向鎖
-XX:+UseTLAB 使用TLAB,默認(rèn)是打開的
-XX:TLABSize 設(shè)置TLAB的大小
也可以通過java代碼來獲取jvm參數(shù)
/**
* @author zhenghuisheng
* @date : 2023/5/19
*/
public class JvmParamTest {
public static void main(String[] args) {
MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();
MemoryUsage usage = memorymbean.getHeapMemoryUsage();
System.out.println("INIT HEAP: " + usage.getInit());
System.out.println("MAX HEAP: " + usage.getMax());
System.out.println("USE HEAP: " + usage.getUsed());
System.out.println("\nFull Information:");
System.out.println("Heap Memory Usage: "
+ memorymbean.getHeapMemoryUsage());
System.out.println("Non-Heap Memory Usage: "
+ memorymbean.getNonHeapMemoryUsage());
List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
System.out.println("===================java optiOns=============== ");
System.out.println(inputArguments);
System.out.println("=======================通過java來獲取相關(guān)系統(tǒng)狀態(tài)============================ ");
int i = (int)Runtime.getRuntime().totalMemory()/1024;//Java 虛擬機(jī)中的內(nèi)存總量,以字節(jié)為單位
System.out.println("總的內(nèi)存量 i is "+i);
int j = (int)Runtime.getRuntime().freeMemory()/1024;//Java 虛擬機(jī)中的空閑內(nèi)存量
System.out.println("空閑內(nèi)存量 j is "+j);
System.out.println("最大內(nèi)存量 is "+Runtime.getRuntime().maxMemory()/1024);
System.out.println("=======================OperatingSystemMXBean============================ ");
OperatingSystemMXBean osm = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
//獲取操作系統(tǒng)相關(guān)信息
System.out.println("osm.getArch() "+osm.getArch());
System.out.println("osm.getAvailableProcessors() "+osm.getAvailableProcessors());
//System.out.println("osm.getCommittedVirtualMemorySize() "+osm.getCommittedVirtualMemorySize());
System.out.println("osm.getName() "+osm.getName());
//System.out.println("osm.getProcessCpuTime() "+osm.getProcessCpuTime());
System.out.println("osm.getVersion() "+osm.getVersion());
//獲取整個(gè)虛擬機(jī)內(nèi)存使用情況
System.out.println("=======================MemoryMXBean============================ ");
MemoryMXBean mm=(MemoryMXBean)ManagementFactory.getMemoryMXBean();
System.out.println("getHeapMemoryUsage "+mm.getHeapMemoryUsage());
System.out.println("getNonHeapMemoryUsage "+mm.getNonHeapMemoryUsage());
//獲取各個(gè)線程的各種狀態(tài),CPU 占用情況,以及整個(gè)系統(tǒng)中的線程狀況
System.out.println("=======================ThreadMXBean============================ ");
ThreadMXBean tm=(ThreadMXBean)ManagementFactory.getThreadMXBean();
System.out.println("getThreadCount "+tm.getThreadCount());
System.out.println("getPeakThreadCount "+tm.getPeakThreadCount());
System.out.println("getCurrentThreadCpuTime "+tm.getCurrentThreadCpuTime());
System.out.println("getDaemonThreadCount "+tm.getDaemonThreadCount());
System.out.println("getCurrentThreadUserTime "+tm.getCurrentThreadUserTime());
//當(dāng)前編譯器情況
System.out.println("=======================CompilatiOnMXBean============================ ");
CompilationMXBean gm=(CompilationMXBean)ManagementFactory.getCompilationMXBean();
System.out.println("getName "+gm.getName());
System.out.println("getTotalCompilationTime "+gm.getTotalCompilationTime());
//獲取運(yùn)行時(shí)信息
System.out.println("=======================RuntimeMXBean============================ ");
RuntimeMXBean rmb=(RuntimeMXBean)ManagementFactory.getRuntimeMXBean();
System.out.println("getClassPath "+rmb.getClassPath());
System.out.println("getLibraryPath "+rmb.getLibraryPath());
System.out.println("getVmVersion "+rmb.getVmVersion());
}
}
其打印結(jié)果如下
INIT HEAP: 268435456
MAX HEAP: 3799515136
USE HEAP: 8061840
Full Information:
Heap Memory Usage: init = 268435456(262144K) used = 8061840(7872K) committed = 257425408(251392K) max = 3799515136(3710464K)
Non-Heap Memory Usage: init = 2555904(2496K) used = 5345064(5219K) committed = 8060928(7872K) max = -1(-1K)
===================java optiOns===============
[-javaagent:D:\idea\IntelliJ IDEA 2019.1\lib\idea_rt.jar=58982:D:\idea\IntelliJ IDEA 2019.1\bin, -Dfile.encoding=UTF-8]
=======================通過java來獲取相關(guān)系統(tǒng)狀態(tài)============================
總的內(nèi)存量 i is 251392
空閑內(nèi)存量 j is 243519
最大內(nèi)存量 is 3710464
=======================OperatingSystemMXBean============================
osm.getArch() amd64
osm.getAvailableProcessors() 4
osm.getName() Windows 10
osm.getVersion() 10.0
=======================MemoryMXBean============================
getHeapMemoryUsage init = 268435456(262144K) used = 8061840(7872K) committed = 257425408(251392K) max = 3799515136(3710464K)
getNonHeapMemoryUsage init = 2555904(2496K) used = 5396384(5269K) committed = 8060928(7872K) max = -1(-1K)
=======================ThreadMXBean============================
getThreadCount 6
getPeakThreadCount 6
getCurrentThreadCpuTime 375000000
getDaemonThreadCount 5
getCurrentThreadUserTime 187500000
=======================CompilatiOnMXBean============================
getName HotSpot 64-Bit Tiered Compilers
getTotalCompilationTime 28
=======================RuntimeMXBean============================
二,GC日志的分析
GC按照回收區(qū)域主要分為兩大類型:一種是部分收集,一種是整堆收集。 部分收集的意思就是不是完整收集整個(gè)java堆的垃圾收集,比如有新生代的Minor GC、老年代的MajorGC;整堆收集就是收集整個(gè)Java堆和方法區(qū)的垃圾收集,比如有Full GC。
觸發(fā)Full GC的場景如下:老年代的空間不足、方法區(qū)的空間不足、顯式調(diào)用System.GC()、Minor GC進(jìn)入老年代的平均大小大于老年代的可用內(nèi)存大小、大對(duì)象直接進(jìn)入老年代
在GC中,一般會(huì)有三個(gè)時(shí)間:user、sys、real。
- user表示的是用戶態(tài)所使用的時(shí)間,這是執(zhí)行此進(jìn)程所使用的實(shí)際CPU時(shí)間。
- sys表示的是內(nèi)核態(tài)消耗的時(shí)間,即在內(nèi)核系統(tǒng)調(diào)用或等待系統(tǒng)事件所使用的CPU時(shí)間
- real是程序開始到結(jié)束的時(shí)間。
如下面是一段線上服務(wù)的GC日志信息
Heap:
PSYoungGen total 1560576K, used 202793K [0x0000000755580000, 0x00000007c0000000, 0x00000007c0000000)
eden space 1376768K, 13% used [0x0000000755580000,0x000000076115da18,0x00000007a9600000)
from space 183808K, 5% used [0x00000007b4c80000,0x00000007b56accb0,0x00000007c0000000)
to space 185344K, 0% used [0x00000007a9600000,0x00000007a9600000,0x00000007b4b00000)
ParOldGen total 3495424K, used 80041K [0x0000000680000000, 0x0000000755580000, 0x0000000755580000)
object space 3495424K, 2% used [0x0000000680000000,0x0000000684e2a410,0x0000000755580000)
Metaspace used 93746K, capacity 98782K, committed 99608K, reserved 1136640K
class space used 11338K, capacity 12190K, committed 12328K, reserved 1048576K
GC日志的格式規(guī)律一般都是:GC前內(nèi)存占用 —> GC后內(nèi)存占用(總內(nèi)存)
[PSYoungGen:5986K -> 696K(8704K)] 5986K -> 704K(9216K)
GC失敗的場景
[GC (Allocation Failure) [PSYoungGen: 2240K->384K(2560K)] 4803K->2947K(9728K), 0.0006347 secs]
也可以使用一些GC工具進(jìn)行日志分析,如GC Easy,GC View工具等等。如下面是一個(gè)GC Easy的官網(wǎng),其地址為:https://gceasy.io/,選擇對(duì)應(yīng)的log文件即可
在選擇文件之后,就可以進(jìn)入到下面的頁面,從上往下滑就可以查看對(duì)應(yīng)的詳細(xì)信息
文章來源:http://www.zghlxwxcb.cn/news/detail-456287.html
在all Thread這里,可以發(fā)現(xiàn)這現(xiàn)線程的狀態(tài),正處于阻塞狀態(tài)
總而言之,這款工具還是挺好使用的文章來源地址http://www.zghlxwxcb.cn/news/detail-456287.html
到了這里,關(guān)于【jvm系列-13】jvm性能調(diào)優(yōu)篇---參數(shù)設(shè)置以及日志分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!