成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JVM 一套卷,助你快速掌握優(yōu)化法則

Jinkey / 1590人閱讀

摘要:一虛擬機(jī)內(nèi)存圖解程序運(yùn)行與虛擬機(jī)之上,運(yùn)行時(shí)需要內(nèi)存空間。是一種數(shù)據(jù)結(jié)構(gòu),是虛擬機(jī)中的局部變量表,對(duì)應(yīng)物理層之上的程序數(shù)據(jù)模型。

一:虛擬機(jī)內(nèi)存圖解

JAVA 程序運(yùn)行與虛擬機(jī)之上,運(yùn)行時(shí)需要內(nèi)存空間。虛擬機(jī)執(zhí)行 JAVA 程序的過程中會(huì)把它管理的內(nèi)存劃分為不同的數(shù)據(jù)區(qū)域方便管理。

虛擬機(jī)管理內(nèi)存數(shù)據(jù)區(qū)域劃分如下圖:

數(shù)據(jù)區(qū)域分類:

方法區(qū): (Method Area)

虛擬機(jī)棧 : (VM Stack)

本地方法棧 : (Native Method Stack)

堆: (Heap)

程序計(jì)數(shù)器: (Program Counter Register)

直接內(nèi)存 : (Direct Memory)

說明:

1、程序計(jì)數(shù)器

行號(hào)指示器,字節(jié)碼指令的分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù) (CPU 切換),每條線程都需要一個(gè)獨(dú)立的計(jì)數(shù)器,線程私有內(nèi)存互不影響, 該區(qū)域不會(huì)發(fā)生內(nèi)存溢出異常。

2、虛擬機(jī)棧

是線程私有的,聲明周期與線程相同,虛擬機(jī)棧是 Java 方法執(zhí)行的內(nèi)存模型,每個(gè)方法被執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀,即方法運(yùn)行期間的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),棧幀用于存儲(chǔ):局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等,每個(gè)方法執(zhí)行中都對(duì)應(yīng)虛擬機(jī)棧幀從入棧到處棧的過程。

是一種數(shù)據(jù)結(jié)構(gòu),是虛擬機(jī)中的局部變量表,對(duì)應(yīng)物理層之上的程序數(shù)據(jù)模型。

局部變量表,是一種程序運(yùn)行數(shù)據(jù)模型,存放了編譯期可知的各種數(shù)據(jù)類型例如:

Boolean、byte、char、short、int、float、long、double、對(duì)象引用類型 (對(duì)象內(nèi)存地址變量,指針或句柄),程序運(yùn)行時(shí),根據(jù)局部變量表分配棧幀空間大小,在運(yùn)行中,大小是不變的異常類型:stackOverFlowError 線程請(qǐng)求棧深度大于虛擬機(jī)允許深度 OutOfMemory 內(nèi)存空間耗盡無法進(jìn)行擴(kuò)展。

3、本地方法棧

與虛擬機(jī)棧類似,虛擬機(jī)棧為 Java 程序服務(wù),本地方法棧支持虛擬機(jī)的運(yùn)行服務(wù),具體實(shí)現(xiàn)由虛擬機(jī)廠商決定,也會(huì)拋出 stackOverFlowError、OutOfMemory 異常。

4、堆

是虛擬機(jī)管理內(nèi)存中最大的一部分,被所有線程共享,用于存放對(duì)象實(shí)例 (對(duì)象、數(shù)組),物理上不連續(xù)的內(nèi)存空間,由于 GC 收集器,分代收集,所以劃分為:新生代 Eden、From SurVivor 空間、To SurVivor 空間,allot buffer(分配空間),可能會(huì)劃分出多個(gè)線程私有的緩沖區(qū),老年代。

5、方法區(qū)

與堆一樣屬于線程共享的內(nèi)存區(qū)域,用于存儲(chǔ)虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼(動(dòng)態(tài)加載 OSGI)等數(shù)據(jù)。理論上屬于 java 虛擬機(jī)的一部分,為了區(qū)分開來叫做 Non-Heap 非堆。

這個(gè)區(qū)域可以選擇不進(jìn)行垃圾回收,該區(qū)域回收目的主要是常量池的回收,及類型的卸載 class, 內(nèi)存區(qū)不足時(shí)會(huì)拋出 OutOfMemory 異常

運(yùn)行時(shí)常量池:

方法區(qū)的一部分,Class 的版本、字段、接口、方法等,及編譯期生成的各種字面量、符號(hào)引用,編譯類加載后存放在該區(qū)域。會(huì)拋出 OutOfMemory 異常。

6、直接內(nèi)存

直接內(nèi)存不屬于虛擬內(nèi)存區(qū)域,是一種基于通道與緩沖區(qū)的 IO 方式,可以使用本地函數(shù)直接分配堆外內(nèi)存,在堆中存儲(chǔ)引用的外部?jī)?nèi)存地址,通過引用完成對(duì)直接引用內(nèi)存的操作,1.4 之后提供的 NIO 顯著提高效率,避免了堆內(nèi)存與 Native 內(nèi)存的來回復(fù)制操作,不受虛擬機(jī)內(nèi)存控制,會(huì)拋出 OUtOfMemory 異常。

二:對(duì)象訪問內(nèi)部實(shí)現(xiàn)過程

對(duì)象訪問 涉及到對(duì)象的地址變更狀態(tài)變更,內(nèi)存地址移動(dòng),變量、接口、實(shí)現(xiàn)類、方法、父類型等。

1、 句柄方式 (訪問)

2、指針方式 (訪問)

優(yōu)缺點(diǎn):

句柄訪問方式:reference 中存儲(chǔ)的是穩(wěn)定的地址,對(duì)象變更時(shí)只會(huì)改變句柄實(shí)例數(shù)據(jù)指針,引用本身不需要修改

指針訪問方式:優(yōu)點(diǎn)速度快,節(jié)省了指針定位時(shí)間開銷

三:內(nèi)存區(qū)域控制參數(shù)及對(duì)應(yīng)溢出異常

開發(fā)過程中,或程序運(yùn)行過程中每次遇到 OutOfMemory 異?;?GC 異?;?StackOverflowError 異常我們都是一堆參數(shù)亂配,都把值調(diào)大,只是大體知道是跟 jvm 內(nèi)存分配有關(guān),具體應(yīng)該怎么調(diào),對(duì)應(yīng)的異常應(yīng)該調(diào)整那些參數(shù),或者換句話說,jvm 內(nèi)存分配區(qū)域中都分別對(duì)應(yīng)那些參數(shù)大多數(shù)情況下都是不知道的,只是把相關(guān)的參數(shù)跳上去,預(yù)期結(jié)果都是應(yīng)該起作用,到底能不能起作用,自己心里也沒底。下面就來說一下 jvm 堆、棧、方法區(qū)等內(nèi)存區(qū)域?qū)?yīng)的參數(shù),及每個(gè)區(qū)域可能拋出的異常類型,發(fā)生異常的場(chǎng)景分析。

1、參數(shù)類型

堆空間參數(shù)

??臻g參數(shù)

方法區(qū)空間參數(shù)

本機(jī)直接內(nèi)存參數(shù)

2、異常類型

OutOfMemory 異常

StackOverflowError 異常

3、輔助參數(shù)說明

-XX:+HeapDumpOnOutOfMemoryError 打印堆內(nèi)存異常時(shí)打印出快照信息

-XX:+HeapDumpPath 快照輸出路徑

-Xmn 指定 eden 區(qū)的大小 -XX:SurvirorRation 來調(diào)整幸存區(qū)的大小

-XX:PretenureSizeThreshold 設(shè)置進(jìn)入老年代的閥值

4、參數(shù)說明、對(duì)應(yīng)場(chǎng)景的異常

1). 堆內(nèi)存參數(shù)

-Xms:堆最小值(新生代和老年代之和)

-Xmx:堆最大值(新生代和老年代之和)

當(dāng)最小值 = 最大值時(shí),這時(shí)堆內(nèi)存是不可擴(kuò)展的。

例:-Xms80M -Xmx80M

通常將 -Xmx 和 -Xms 設(shè)置為一樣的大小來減少 gc 的次數(shù),堆內(nèi)存不足時(shí)拋出 OutOfMemoryError 異常。

2). 棧內(nèi)存參數(shù)

-Xss

例:-Xss128k

單線程下無論棧幀太大還是棧容量太小,及引用深度超過虛擬機(jī)允許深度都會(huì)拋出 StackOverflowError 每個(gè)方法壓入棧的幀大小是不一致的。多線程下當(dāng)每個(gè)線程分配棧幀太大內(nèi)存不能夠擴(kuò)展時(shí)拋出 OutOfMemoryError 異常線程棧幀越大,可創(chuàng)建的線程越少。

3). 方法區(qū)參數(shù)

-XX:PermSize 方法區(qū)內(nèi)存最小值

-XX:MaxPermSize 方法區(qū)內(nèi)存最大值

各個(gè)線程共享的內(nèi)存區(qū)域,主要用來存儲(chǔ)類的元數(shù)據(jù)、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)

例:-XX:PermSize=20M -XX:MaxPermSize=20M

異常類型 OutOfMemoryError :

原因:常量過多,或代理反射等使用頻繁

4). 本機(jī)直接內(nèi)存參數(shù)

-XX:MaxDirectMemorySize

例:-XX:MaxDirectMemorySize=10M

不足時(shí)拋出 OutOfMemory 異常

四:垃圾收集算法

經(jīng)典的垃圾回收算法以下幾種

1、標(biāo)記–清除算法 (Mark-Sweep)

回收前狀態(tài):

回收后狀態(tài):

優(yōu)缺點(diǎn):

算法執(zhí)行分為兩個(gè)階段標(biāo)記與清除,所有的回收算法,基本都

基于標(biāo)記回收算法做了深度優(yōu)化

缺點(diǎn):效率問題,內(nèi)存空間碎片(不連續(xù)的空間)

2、復(fù)制算法 (Copying)

回收前狀態(tài):

Eden 內(nèi)存空間 8

Survivor1 空間(From 空間)1

Survivor2 空間 (To 空間) 1

Eden 內(nèi)存空間與 Survivor 空間 8:1

回收后狀態(tài):

Survivor1 空間(From 空間)1

Eden 內(nèi)存空間與 Survivor 空間 8:1

優(yōu)缺點(diǎn):

比較標(biāo)記清除算法,避免了回收造成的內(nèi)存碎片問題,

缺點(diǎn):以局部的內(nèi)存空間犧牲為代價(jià),不過空間的浪費(fèi)比較小,默認(rèn) 8:1 的比例 1 是浪費(fèi)的。

復(fù)制也有一定的效率與空間成本

3、標(biāo)記整理算法 (Mark-Compact)

回收前狀態(tài):

回收后狀態(tài):

優(yōu)缺點(diǎn):

避免了,空間的浪費(fèi),與內(nèi)存碎片問題。

缺點(diǎn):整理時(shí)復(fù)制有效率成本。

五:垃圾收集器

1、七種垃圾收集器

(1) Serial(串行 GC)-XX:+UseSerialGC

(2) ParNew(并行 GC)-XX:+UseParNewGC

(3) Parallel Scavenge(并行回收 GC)

(4) Serial Old(MSC)(串行 GC)-XX:+UseSerialGC

(5) CMS(并發(fā) GC)-XX:+UseConcMarkSweepGC

(6) Parallel Old(并行 GC)-XX:+UseParallelOldGC

(7) G1(JDK1.7update14 才可以正式商用)

2、1~3 用于年輕代垃圾回收:年輕代的垃圾回收稱為 minor GC

3、4~6 用于年老代垃圾回收(當(dāng)然也可以用于方法區(qū)的回收):年老代的垃圾回收稱為 full GC

G1 獨(dú)立完成 "分代垃圾回收"

注意:并行與并發(fā)

并行:多條垃圾回收線程同時(shí)操作

并發(fā):垃圾回收線程與用戶線程一起操作

4、常用五種組合

Serial/Serial Old

ParNew/Serial Old:與上邊相比,只是比年輕代多了多線程垃圾回收而已

ParNew/CMS:當(dāng)下比較高效的組合

Parallel Scavenge/Parallel Old:自動(dòng)管理的組合

G1:最先進(jìn)的收集器,但是需要 JDK1.7update14 以上

5. Serial/Serial Old

年輕代 Serial 收集器采用單個(gè) GC 線程實(shí)現(xiàn) "復(fù)制" 算法(包括掃描、復(fù)制)

年老代 Serial Old 收集器采用單個(gè) GC 線程實(shí)現(xiàn) "標(biāo)記 - 整理" 算法

Serial 與 Serial Old 都會(huì)暫停所有用戶線程(即 STW)

說明:

STW(stop the world):編譯代碼時(shí)為每一個(gè)方法注入 safepoint(方法中循環(huán)結(jié)束的點(diǎn)、方法執(zhí)行結(jié)束的點(diǎn)),在暫停應(yīng)用時(shí),需要等待所有的用戶線程進(jìn)入 safepoint,之后暫停所有線程,然后進(jìn)行垃圾回收。

適用場(chǎng)合:

CPU 核數(shù) <2,物理內(nèi)存 <2G 的機(jī)器(簡(jiǎn)單來講,單 CPU,新生代空間較小且對(duì) STW 時(shí)間要求不高的情況下使用)

-XX:UseSerialGC:強(qiáng)制使用該 GC 組合

-XX:PrintGCApplicationStoppedTime:查看 STW 時(shí)間

6.ParNew/Serial Old:

ParNew 除了采用多 GC 線程來實(shí)現(xiàn)復(fù)制算法以外,其他都與 Serial 一樣,但是此組合中的 Serial Old 又是一個(gè)單 GC 線程,所以該組合是一個(gè)比較尷尬的組合,在單 CPU 情況下沒有 Serial/Serial Old 速度快(因?yàn)?ParNew 多線程需要切換),在多 CPU 情況下又沒有之后的三種組合快(因?yàn)?Serial Old 是單 GC 線程),所以使用其實(shí)不多。

-XX:ParallelGCThreads:指定 ParNew GC 線程的數(shù)量,默認(rèn)與 CPU 核數(shù)相同,該參數(shù)在于 CMS GC 組合時(shí),也可能會(huì)用到

7.Parallel Scavenge/Parallel Old:

特點(diǎn):

年輕代 Parallel Scavenge 收集器采用多個(gè) GC 線程實(shí)現(xiàn) "復(fù)制" 算法(包括掃描、復(fù)制)年老代 Parallel Old 收集器采用多個(gè) GC 線程實(shí)現(xiàn) "標(biāo)記 - 整理" 算 ParallelScavenge 與 Parallel Old 都會(huì)暫停所有用戶線程(即 STW)

說明:

吞吐量:CPU 運(yùn)行代碼時(shí)間 /(CPU 運(yùn)行代碼時(shí)間 +GC 時(shí)間)CMS 主要注重 STW 的縮短(該時(shí)間越短,用戶體驗(yàn)越好,所以主要用于處理很多的交互任務(wù)的情況)Parallel Scavenge/Parallel Old 主要注重吞吐量(吞吐量越大,說明 CPU 利用率越高,所以主要用于處理很多的 CPU 計(jì)算任務(wù)而用戶交互任務(wù)較少的情況)

參數(shù)設(shè)置:

-XX:+UseParallelOldGC:使用該 GC 組合

-XX:GCTimeRatio:直接設(shè)置吞吐量大小,假設(shè)設(shè)為 19,則允許的最大 GC 時(shí)間占總時(shí)間的 1/(1+19),默認(rèn)值為 99,即 1/(1+99)

-XX:MaxGCPauseMillis:最大 GC 停頓時(shí)間,該參數(shù)并非越小越好

-XX:+UseAdaptiveSizePolicy:開啟該參數(shù),-Xmn/-XX:SurvivorRatio/-XX:PretenureSizeThreshold 這些參數(shù)就不起作用了,虛擬機(jī)會(huì)自動(dòng)收集監(jiān)控信息,動(dòng)態(tài)調(diào)整這些參數(shù)以提供最合適的的停頓時(shí)間或者最大的吞吐量(GC 自適應(yīng)調(diào)節(jié)策略),而我們需要設(shè)置的就是 -Xmx,-XX:+UseParallelOldGC 或 -XX:GCTimeRatio 兩個(gè)參數(shù)就好(當(dāng)然 -Xms 也指定上與 -Xmx 相同就好)

注意:

-XX:GCTimeRatio 和 -XX:MaxGCPauseMillis 設(shè)置一個(gè)就好

不開啟 -XX:+UseAdaptiveSizePolicy,-Xmn/-XX:SurvivorRatio/-XX:PretenureSizeThreshold 這些參數(shù)依舊可以配置,以 resin 服務(wù)器為例

-Xms2048m -Xmx2048m -Xmn512m -Xss1m -XX:PermSize=256M -XX:MaxPermSize=256M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:+UseParallelOldGC -XX:GCTimeRatio=19 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps View Code

適用場(chǎng)合:

很多的 CPU 計(jì)算任務(wù)而用戶交互任務(wù)較少的情況不想自己去過多的關(guān)注 GC 參數(shù),想讓虛擬機(jī)自己進(jìn)行調(diào)優(yōu)工作

8、調(diào)優(yōu)方法

8.1 新對(duì)象預(yù)留新生代

由于 fullGC(老年代) 的成本遠(yuǎn)比 minorGC(新生代和老年代)的成本大,所以給應(yīng)用分配一個(gè)合理的新生代空間,盡量將對(duì)象分配到新生代減小 fullGC 的頻率

8.2 大對(duì)象進(jìn)入老年代

將大對(duì)象直接分配到老年代,保持新生代對(duì)象的結(jié)構(gòu)的完整性,以提高 GC 效率, 以通過 -XX:PretenureSizeThreshold 設(shè)置進(jìn)入老年代的閥值

8.3 穩(wěn)定與震蕩的堆大小

穩(wěn)定的對(duì)大小是對(duì)垃圾回收有利的,方法將 -Xms 和 -Xmx 的大小一致

8.4 吞吐量?jī)?yōu)先

盡可能減少系統(tǒng)執(zhí)行垃圾回收的總時(shí)間,故采用并行垃圾回收器

-XX:+UseParallelGC 或使用 -XX:+UseParallelOldGC

8.5 降低停頓

使用 CMS 回收器, 同時(shí)減少 fullGC 的次數(shù)

9、獲取 gc 信息的方法

9.1 -verbose:gc 或者 -XX:+PrintGC  獲取 gc 信息

9.2 -XX:+PrintGCDetails  獲取更加詳細(xì)的 gc 信息

9.3 -XX:+PrintGCTimeStamps  獲取 GC 的頻率和間隔

9.4 -XX:+PrintHeapAtGC  獲取堆的使用情況

9.5 -Xloggc:D:gc.log  指定日志情況的保存路徑

10、jvm 調(diào)優(yōu)實(shí)戰(zhàn) -tomcat 啟動(dòng)加速

在 tomcat 的 bin/catalina.bat 文件的開頭添加相關(guān)的配置

11、jvm 深入學(xué)習(xí)

如果想要系統(tǒng)深入學(xué)習(xí) JVM 的話,我在這里給大家推薦一個(gè) Java 方面的交流學(xué)習(xí)群:650385180,里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有 Spring,MyBatis,Netty 源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM 性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源,相信對(duì)于已經(jīng)工作和遇到技術(shù)瓶頸的碼友,在這個(gè)群里會(huì)有你需要的內(nèi)容。

六:監(jiān)控工具

監(jiān)控工具:一般問題定位,性能調(diào)優(yōu)都會(huì)使用到。

1、jps

Jps 是參照 Unix 系統(tǒng)的取名規(guī)則命名的,而他的功能和 ps 的功能類似,可以列舉正在運(yùn)行的餓虛擬機(jī)進(jìn)程并顯示虛擬機(jī)執(zhí)行的主類以及這些進(jìn)程的唯一 ID(LVMID,對(duì)應(yīng)本機(jī)來說和 PID 相同),他的用法如下:

Jps [option] [hostid]

jps -q 只輸出 LVMID

jps -m 輸出 JVM 啟動(dòng)時(shí)傳給主類的方法

jps -l 輸出主類的全名,如果是 Jar 則輸出 jar 的路徑

jps -v 輸出 JVM 的啟動(dòng)參數(shù)

2、jstat

jstat 主要用于監(jiān)控虛擬機(jī)的各種運(yùn)行狀態(tài)信息,如類的裝載、內(nèi)存、垃圾回收、JIT 編譯器等,在沒有 GUI 的服務(wù)器上,這款工具是首選的一款監(jiān)控工具。其用法如下:

jstat [option vmid [interval [s|ms] [vount] ] ]

jstat 監(jiān)控內(nèi)容 線程好 刷新時(shí)間間隔 次數(shù)

jstat –gc 20445 1 20 : 監(jiān)視 Java 堆,包含 eden、2 個(gè) survivor 區(qū)、old 區(qū)和永久帶區(qū)域的容量、已用空間、GC 時(shí)間合計(jì)等信息

jstat –gcutil 20445 1 20: 監(jiān)視內(nèi)容與 -gc 相同,但輸出主要關(guān)注已使用空間占總空間的百分比

jstat –class 20445 1 20: 監(jiān)視類的裝載、卸載數(shù)量以及類的裝載總空間和耗費(fèi)時(shí)間等

…….-gccapcity……: 監(jiān)視內(nèi)容與 -gc 相同,但輸出主要關(guān)注 Java 區(qū)域用到的最大和最小空間

…….-gccause……..: 與 -gcutil 輸出信息相同,額外輸出導(dǎo)致上次 GC 產(chǎn)生的原因

…….-gcnew……….: 監(jiān)控新生代的 GC 情況

…….-gcnewcapacity..: 與 -gcnew 監(jiān)控信息相同,輸出主要關(guān)注使用到的最大和最小空間

…….-gcold……….: 監(jiān)控老生代的 GC 情況

…….-gcoldcapacity..: 與 -gcold 監(jiān)控信息相同,輸出主要關(guān)注使用到的最大和最小空間

…….-gcpermcapacity.: 輸出永久帶用到的最大和最小空間

…….-compiler…….: 輸出 JIT 編譯器編譯過的方法、耗時(shí)信息

…….-printcompilation: 輸出已經(jīng)被 JIT 編譯的方法

3、jinfo

jinfo 的作用是實(shí)時(shí)查看虛擬機(jī)的各項(xiàng)參數(shù)信息 jps –v 可以查看虛擬機(jī)在啟動(dòng)時(shí)被顯式指定的參數(shù)信息,但是如果你想知道默認(rèn)的一些參數(shù)信息呢?除了去查詢對(duì)應(yīng)的資料以外,jinfo 就顯得很重要了。jinfo 的用法如下:

Jinfo [option] pid

4、jmap

map 用于生成堆快照(heapdump)。當(dāng)然我們有很多方法可以取到對(duì)應(yīng)的 dump 信息,如我們通過 JVM 啟動(dòng)時(shí)加入啟動(dòng)參數(shù) –XX:HeapDumpOnOutOfMemoryError 參數(shù),可以讓 JVM 在出現(xiàn)內(nèi)存溢出錯(cuò)誤的時(shí)候自動(dòng)生成 dump 文件,亦可以通過 -XX:HeapDumpOnCtrlBreak 參數(shù),在運(yùn)行時(shí)使用 ctrl+break 按鍵生成 dump 文件,當(dāng)然我們也可以使用 kill -3 pid 的方式去恐嚇 JVM 生成 dump 文件。Jmap 的作用不僅僅是為了獲取 dump 文件,還可以用于查詢 finalize 執(zhí)行隊(duì)列、Java 堆和永久帶的詳細(xì)信息,如空間使用率、垃圾回收器等。其運(yùn)行格式如下:

Jmap [option] vmip

監(jiān)控堆棧信息主要用來定位問題的原因,生成堆??煺?/p>

…….-dump……: 生成對(duì)應(yīng)的 dump 信息,用法為 -dump:[live,]format=b,file={fileName}

…….-finalizerinfo……: 顯示在 F-Queue 中等待的 Finalizer 方法的對(duì)象(只在 linux 下生效)

…….-heap……:顯示堆的詳細(xì)信息、垃圾回收器信息、參數(shù)配置、分代詳情等

…….-histo……:顯示堆棧中的對(duì)象的統(tǒng)計(jì)信息,包含類、實(shí)例數(shù)量和合計(jì)容量

…….-permstat……:以 ClassLoder 為統(tǒng)計(jì)口徑顯示永久帶的內(nèi)存狀態(tài)

…….-F……:虛擬機(jī)對(duì) -dump 無響應(yīng)時(shí)可使用這個(gè)選項(xiàng)強(qiáng)制生成 dump 快照

例子:jmap -dump:format=b,file=yhj.dump 20445

5、jstack

Jstack 用于 JVM 當(dāng)前時(shí)刻的線程快照,又稱 threaddump 文件,它是 JVM 當(dāng)前每一條線程正在執(zhí)行的堆棧信息的集合。生成線程快照的主要目的是為了定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程死鎖、死循環(huán)、請(qǐng)求外部時(shí)長(zhǎng)過長(zhǎng)導(dǎo)致線程停頓的原因。通過 jstack 我們就可以知道哪些進(jìn)程在后臺(tái)做些什么?在等待什么資源等!其運(yùn)行格式如下:

Jstack [option] vmid

-F 當(dāng)正常輸出的請(qǐng)求不響應(yīng)時(shí)強(qiáng)制輸出線程堆棧

-l 除堆棧信息外,顯示關(guān)于鎖的附加信息

-m 顯示 native 方法的堆棧信息

6、jconsole

在 JDK 的 bin 目錄下, 監(jiān)控內(nèi)存,thread, 堆棧等

7、jprofile

類似于 jconsole, 比 jconsole 監(jiān)控信息更全面,內(nèi)存,線程,包,cup 類,堆棧,等等

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76711.html

相關(guān)文章

  • 北上廣深杭房?jī)r(jià)高壓下,這也許是程序員扎根的唯一出路...

    摘要:在不考慮通脹和工資增長(zhǎng)的情況下,除去吃喝需要攢年才能攢出一線城市房子的首付,以這樣的收入水平,基本上沒法扎根。 簡(jiǎn)單算一筆賬,目前小公司Java后端工資一般是1萬出頭,年薪普遍在20萬以下。在不考慮通脹和工資增長(zhǎng)的情況下,除去吃喝需要攢30年才能攢出一線城市房子的首付,以這樣的收入水平,基本...

    Pink 評(píng)論0 收藏0
  • 12個(gè)優(yōu)秀資源助你迅速掌握正則表達(dá)式

    摘要:給開發(fā)人員使用的正則表達(dá)式測(cè)試儀。一個(gè)令人非常興奮的項(xiàng)目,可以改變開發(fā)人員使用正則表達(dá)式的方式。它的目的是使正則表達(dá)式易于閱讀和使用命令編寫。實(shí)時(shí)的正則表達(dá)式測(cè)試工具,支持,,和。 正則表達(dá)式是每個(gè)程序開發(fā)人員的必備技能。任何開發(fā)項(xiàng)目,不管使用什么編程語言,都需要從給定的數(shù)據(jù)提取值并進(jìn)行驗(yàn)證。例如對(duì)輸入內(nèi)容的驗(yàn)證,過濾 URL 變量等等,正則表達(dá)式處理這樣的任務(wù)很容易,而且只需要很少的...

    zoomdong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<