新聞中心
使用Linux Hprof分析工具進(jìn)行快速代碼優(yōu)化

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站設(shè)計(jì)、大連網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、大連網(wǎng)絡(luò)營銷、大連企業(yè)策劃、大連品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供大連建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
作為一名開發(fā)人員,我們常常會遇到優(yōu)化代碼的情況。不過,優(yōu)化代碼是一個(gè)不容易被完成的任務(wù)。優(yōu)化過程中,我們必須仔細(xì)檢查代碼,找到其中潛在的性能問題,并嘗試改進(jìn)它們。在這個(gè)過程中,我們需要使用各種工具和技術(shù)。其中一種非常受歡迎的工具是Hprof分析工具。
Hprof是一種Java虛擬機(jī)(JVM)所提供的性能分析器。它可以色分析Java應(yīng)用程序在運(yùn)行時(shí)所占用的內(nèi)存空間,并且可以讓開發(fā)人員判斷和確定哪些代碼和對象使用了大量的堆內(nèi)存。該工具可以快速發(fā)現(xiàn)內(nèi)存泄漏和其他性能問題。本文將會探討如何使用Linux Hprof分析工具進(jìn)行快速代碼優(yōu)化。
Step 1:安裝Hprof
在Linux系統(tǒng)中安裝Hprof是非常簡單的。我們只需要打開終端窗口,輸入以下命令即可:
sudo apt-get install hprof
這個(gè)命令將會立即下載和安裝Hprof工具。
Step 2:使用Hprof生成分析文件
完成Hprof的安裝后,我們可以使用命令行命令來生成分析文件。Hprof會生成一個(gè)包含了Java應(yīng)用程序運(yùn)行時(shí)所占用的所有內(nèi)存數(shù)據(jù)的文件。
在命令行中輸入以下命令:
java -agentlib:hprof=heap=sites,format=a -classpath
這個(gè)命令將會使用Hprof來分析Java應(yīng)用程序的堆內(nèi)存使用情況。-agentlib:hprof選項(xiàng)表示在JVM上使用Hprof分析工具。-heap選項(xiàng)指定顯示堆內(nèi)存使用情況。-sites選項(xiàng)指定顯示哪些類和對象最常用。-format選項(xiàng)指定輸出文件的格式。
Step 3:分析生成文件
分析在生成文件后,我們可以使用Hprof分析工具來讀取和分析該文件。在命令行中輸入以下命令:
jhat [分析文件名稱]
這個(gè)命令可以打開默認(rèn)的Java堆分析器(JHat),并加載我們創(chuàng)建的分析文件。
Step 4:快速定位性能問題
在JHat中,我們可以快速定位性能問題。JHat會在瀏覽器中顯示一個(gè)包含了堆內(nèi)存使用情況的圖表,我們可以使用它來查找對象泄漏、內(nèi)存使用量過大或內(nèi)存泄漏等其他問題。
除此之外,我們還可以通過Java Profiler或Hprof工具的命令行界面來分析生成文件。在這些工具中,我們可以找到更多的優(yōu)化建議和其他調(diào)試信息。
結(jié)論
Hprof分析工具是優(yōu)化代碼的一種非常有用的工具。它能夠快速發(fā)現(xiàn)內(nèi)存泄漏和其他性能問題,并提供給開發(fā)人員定位和優(yōu)化這些問題所需的重要信息。本文提供了一系列步驟,幫助開發(fā)人員快速使用Linux Hprof分析工具進(jìn)行代碼優(yōu)化。
相關(guān)問題拓展閱讀:
- 在新建虛擬機(jī)時(shí)出現(xiàn)問題?
- 如何手動生存 hprof文件 linux
在新建虛擬機(jī)時(shí)出現(xiàn)問題?
JConsole
JConsole 圖形用戶界面是一種符合 Java 管理擴(kuò)展(JMX)規(guī)范的監(jiān)視工具。JConsole 使用 Java 虛擬機(jī) (Java VM) 的廣泛檢測來提供有關(guān)在 Java 平臺上運(yùn)行的應(yīng)用程序的性能和資源消耗的信息。
使用方法 本地
使用jconsole命令:監(jiān)視本地運(yùn)行的所有 Java 應(yīng)用程序鎮(zhèn)擾明,JConsole 可以連接到這些應(yīng)用程序。
使用jconsole PID命令:監(jiān)視指定PID的Java應(yīng)用程序。
獲取java PID的方法:通過任務(wù)管理器查看、通過Java提供的jps命令查看。遠(yuǎn)程
使用jsconsole hostName:portNum命令:hostName是運(yùn)行應(yīng)用程序的系統(tǒng)的名稱,portNum是您在啟動Java VM時(shí)啟用 JMX 代理時(shí)指定的端口號。
使用service:jmx::命令:使用 JMX 服務(wù) URL 進(jìn)行連接。
內(nèi)容分析
將 JConsole 連接到應(yīng)用程序后,JConsole 由六個(gè)選項(xiàng)卡組成。
概述:顯示有關(guān) Java VM 和受監(jiān)視值的概述信息。
內(nèi)存:顯示有關(guān)內(nèi)存使用的信息。
線程:顯示有關(guān)線程使用的信息。
類:顯示有關(guān)類加載的信息。
VM:顯示有關(guān) Java VM 的信息。
MBeans:顯示有關(guān) MBeans 的信息。
組成部分 概覽
顯示有關(guān) CPU 使用情況、內(nèi)存使用情況、線程計(jì)數(shù)和在Java VM中加載的類的圖形監(jiān)視信息。
提供執(zhí)行GC的操作,可以隨時(shí)點(diǎn)擊按鈕進(jìn)行垃圾回收
伊甸園空間(堆):最初為大多數(shù)對象分配內(nèi)存的池。
幸存者空間(堆):包含在伊甸園空間垃圾回收中幸存下來的物體的池。
終身代(堆):包含在幸存者空間中存在一段時(shí)間的對象的池。
永久生成(非堆):包含虛擬機(jī)本身的所有反射數(shù)據(jù)的池,如類和方法對象。使用類數(shù)據(jù)共享的 Java VM,這一代分為只讀和讀寫區(qū)域。
代碼緩存(非堆):HotSpotJava VM 還包括一個(gè)代碼緩存,其中包含用于編譯和存儲本李辯機(jī)代碼的內(nèi)存。
堆和非堆內(nèi)存
Java VM管理兩種類型的內(nèi)存:堆內(nèi)存和非堆內(nèi)存,這兩種內(nèi)存都是在 Java VM 啟動時(shí)創(chuàng)建的。
堆內(nèi)存是Java VM為所有類實(shí)例和數(shù)組分配內(nèi)存的運(yùn)行時(shí)數(shù)據(jù)區(qū)域。堆的大小可能是固定的或可變的。垃圾回收器是一個(gè)自動內(nèi)存管理系統(tǒng),用于回收對象的堆內(nèi)存。
非堆內(nèi)存包括所有線程之間共享的方法區(qū)域和Java VM的內(nèi)部處理或優(yōu)化所御告需的內(nèi)存。它存儲每類結(jié)構(gòu),如運(yùn)行時(shí)常量池、字段和方法數(shù)據(jù),以及方法和構(gòu)造函數(shù)的代碼。方法區(qū)域在邏輯上是堆的一部分,但是,根據(jù)實(shí)現(xiàn),Java VM 可能不會對它進(jìn)行垃圾回收或壓縮。與堆內(nèi)存一樣,方法區(qū)域可能為固定大小或可變大小。方法區(qū)域的內(nèi)存不需要連續(xù)。
內(nèi)存池和內(nèi)存管理器
內(nèi)存池和內(nèi)存管理器是Java VM內(nèi)存系統(tǒng)的關(guān)鍵方面。
內(nèi)存池表示Java VM管理的內(nèi)存區(qū)域。Java VM至少有一個(gè)內(nèi)存池,它可能會在執(zhí)行期間創(chuàng)建或刪除內(nèi)存池。內(nèi)存池可以屬于堆內(nèi)存或非堆內(nèi)存。
內(nèi)存管理器管理一個(gè)或多個(gè)內(nèi)存池。垃圾回收器是一種內(nèi)存管理器,負(fù)責(zé)回收不可到達(dá)的對象使用的內(nèi)存。Java VM可能具有一個(gè)或多個(gè)內(nèi)存管理器。它可以在執(zhí)行期間添加或刪除內(nèi)存管理器。內(nèi)存池可以由多個(gè)內(nèi)存管理器管理。
垃圾回收
垃圾回收 (GC) 是Java VM釋放不再引用的對象占用的內(nèi)存的方式。通常認(rèn)為具有活動引用為”活動”且未引用(或無法訪問)對象的對象為”已死”。垃圾回收是釋放死對象使用的內(nèi)存的過程。GC 使用的算法和參數(shù)對性能有顯著影響。
Java hotspot VM垃圾回收器使用代數(shù) GC。生成 GC 利用大多數(shù)程序符合以下概括的觀察。
它們創(chuàng)建許多壽命較短的對象,例如迭代器和局部變量。
它們創(chuàng)建一些壽命很長的對象,例如高級持久對象。
線程
提供有關(guān)線程使用的信息。
查找監(jiān)視器死鎖線程:檢測對象監(jiān)視器鎖上是否有任何線程死鎖。此操作返回死鎖線程指示的數(shù)組。
getThreadInfo:返回線程信息。這包括線程當(dāng)前被阻止的名稱、堆棧跟蹤和監(jiān)視器鎖(如果有)以及持有該鎖的線程以及線程爭用統(tǒng)計(jì)信息。
獲取ThreadCpu時(shí)間:返回給定線程消耗的 CPU 時(shí)間
顯示有關(guān)類加載的信息。
提供有關(guān)Java VM的信息。
以通用方式顯示有關(guān)在平臺 MBean 服務(wù)器注冊的所有 MBeans 的信息。MBeans 選項(xiàng)卡允許您訪問平臺 MXBean 檢測的完整集,包括在其他選項(xiàng)卡中不可見的儀器。此外,您還可以使用 MBeans 選項(xiàng)卡監(jiān)視和管理應(yīng)用程序的 MBeans。
列出目標(biāo)系統(tǒng)上已檢測的 Java 虛擬機(jī) (JVM)。
監(jiān)視 Java 虛擬機(jī) (JVM) 統(tǒng)計(jì)信息。
對Java應(yīng)用程序的資源和性能進(jìn)行實(shí)時(shí)的命令行的監(jiān)控,包括了對Heap size和垃圾回收狀況的監(jiān)控。
命令格式
jstat
option參數(shù)
class:顯示有關(guān)類加載器行為的統(tǒng)計(jì)信息。
compiler:顯示有關(guān)Java HotSpot VM實(shí)時(shí)編譯器行為的統(tǒng)計(jì)信息。
gc:顯示有關(guān)垃圾回收堆行為的統(tǒng)計(jì)信息。
gccapacity:顯示有關(guān)幾代人容量及其相應(yīng)空間的統(tǒng)計(jì)信息。
gccause:顯示有關(guān)垃圾回收統(tǒng)計(jì)信息(與 相同)的摘要,以及最后和當(dāng)前(如果適用)垃圾回收事件的原因。-gcutil
gcnew:顯示新一代行為的統(tǒng)計(jì)信息。
gcnewcapacity:顯示有關(guān)新一代大小及其相應(yīng)空間的統(tǒng)計(jì)信息。
gcold:顯示有關(guān)舊一代和元空間統(tǒng)計(jì)信息行為的統(tǒng)計(jì)信息。
gcoldcapacity:顯示有關(guān)舊一代大小的統(tǒng)計(jì)信息。
gcmetacapacity:顯示有關(guān)元空間大小的統(tǒng)計(jì)信息。
gcutil:顯示有關(guān)垃圾回收統(tǒng)計(jì)信息的摘要。
printcompilation:顯示 Java 熱點(diǎn) VM 編譯方法統(tǒng)計(jì)信息。
1.jstat –class: 顯示加載class的數(shù)量,及所占空間等信息。
2.jstat -compiler顯示VM實(shí)時(shí)編譯的數(shù)量等信息。
3.jstat -gc: 可以顯示gc的信息,查看gc的次數(shù),及時(shí)間。
4.jstat -gccapacity:可以顯示,VM內(nèi)存中三代(young,old,perm)對象的使用和占用大小
5.jstat -gcutil:統(tǒng)計(jì)gc信息
6.jstat -gcnew:年輕代對象的信息。
7.jstat -gcnewcapacity: 年輕代對象的信息及其占用量。
8.jstat -gcold:old代對象的信息。
9.jstat -gcoldcapacity: old代對象的信息及其占用量。
10.jstat -gcpermcapacity: perm對象的信息及其占用量。
11.jstat -printcompilation:當(dāng)前VM執(zhí)行的信息。
監(jiān)視 Java 虛擬機(jī) (JVM),并使遠(yuǎn)程監(jiān)視工具能夠連接到 JVM
命令格式
jstatd –
option
-nr當(dāng)找不到現(xiàn)有的RMI注冊表時(shí),不嘗試使用jstatd進(jìn)程創(chuàng)建一個(gè)內(nèi)部的RMI注冊表。
-p port在指定的端口查找RMI注冊表。如果沒有找到,并且沒有指定-nr選項(xiàng),則在該端口自行創(chuàng)建一個(gè)內(nèi)部的RMI注冊表。
-n rminameRMI注冊表中綁定的RMI遠(yuǎn)程對象的名稱。默認(rèn)的名稱為tatRemoteHost。如果多個(gè)jstatd服務(wù)器在同一主機(jī)上運(yùn)行,你可以通過指定該選項(xiàng)來讓每個(gè)服務(wù)器導(dǎo)出的RMI對象具有唯一的名稱。不管如何,這樣做需要將唯一的服務(wù)器名稱包含進(jìn)監(jiān)控客戶端的hostid和vmid字符串中。
-Joption將選項(xiàng)參數(shù)傳遞給被javac調(diào)用的java啟動程序。例如,-J-Xms48m設(shè)置啟動內(nèi)存為48 MB。使用-J將選項(xiàng)參數(shù)傳遞給執(zhí)行Java應(yīng)用程序的底層虛擬機(jī),這是一種常見慣例。
使用方法
1.在jdk的bin目錄下創(chuàng)建文件jstatd.all.policy
2.寫入下面的安全配置
grant codebase “file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/lib/tools.jar” {
permission java.security.AllPermission;
#此處寫絕對路徑,主要是防止路徑錯(cuò)誤問題,排查問題,應(yīng)該寫成相對路徑
3.啟動jstatd
./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=x.x.x.x &
4.使用jvisualvm工具遠(yuǎn)程連接,進(jìn)行監(jiān)控
jvisualvm
VisualVM,能夠監(jiān)控線程,內(nèi)存情況,查看方法的CPU時(shí)間和內(nèi)存中的對 象,已被GC的對象,反向查看分配的堆棧(如100個(gè)String對象分別由哪幾個(gè)對象分配出來的).
同時(shí)他還提供很多插件可以自己安裝,是一款不錯(cuò)的監(jiān)控分析工具。
故障排除工具 JInfo
可以用來查看正在運(yùn)行的 java 應(yīng)用程序的擴(kuò)展參數(shù),包括Java System屬性和JVM命令行參數(shù);也可以動態(tài)的修改正在運(yùn)行的 JVM 一些參數(shù)。當(dāng)系統(tǒng)崩潰時(shí),jinfo可以從core文件里面知道崩潰的Java應(yīng)用程序的配置信息
命令格式
參數(shù)說明
pid對應(yīng)jvm的進(jìn)程id
executable core產(chǎn)生core dump文件
remote server IP or hostname遠(yuǎn)程的ip或者h(yuǎn)ostname,server-id標(biāo)記服務(wù)的唯一性id
option
no option輸出全部的參數(shù)和系統(tǒng)屬性
-flag name輸出對應(yīng)名稱的參數(shù)
-flag name開啟或者關(guān)閉對應(yīng)名稱的參數(shù)
-flag name=value設(shè)定對應(yīng)名稱的參數(shù)
-flags輸出全部的參數(shù)
-sysprops輸出系統(tǒng)屬性
Javacore 概述
Javacore,也可以稱為“threaddump”或是“javadump”,它是 Java 提供的一種診斷特性,能夠提供一份可讀的當(dāng)前運(yùn)行的 JVM 中線程使用情況的快照。即在某個(gè)特定時(shí)刻,JVM 中有哪些線程在運(yùn)行,每個(gè)線程執(zhí)行到哪一個(gè)類,哪一個(gè)方法。應(yīng)用程序如果出現(xiàn)不可恢復(fù)的錯(cuò)誤或是內(nèi)存泄露,就會自動觸發(fā) Javacore 的生成。
使用方法
1.jinfo pid:輸出當(dāng)前 jvm 進(jìn)程的全部參數(shù)和系統(tǒng)屬性
2.jinfo -flag name pid:輸出對應(yīng)名稱的參數(shù)使用該命令,可以查看指定的 jvm 參數(shù)的值。如:查看當(dāng)前 jvm 進(jìn)程是否開啟打印 GC 日志。
3.jinfo -flag name pid:開啟或者關(guān)閉對應(yīng)名稱的參數(shù)
使用 jinfo 可以在不重啟虛擬機(jī)的情況下,可以動態(tài)的修改 jvm 的參數(shù)。尤其在線上的環(huán)境特別有用。
4.jinfo -flag name=value pid:修改指定參數(shù)的值。
注意:jinfo雖然可以在java程序運(yùn)行時(shí)動態(tài)地修改虛擬機(jī)參數(shù),但并不是所有的參數(shù)都支持動態(tài)修改
5.jinfo -flags pid:輸出全部的參數(shù)
6.jinfo -sysprops pid:輸出當(dāng)前 jvm 進(jìn)行的全部的系統(tǒng)屬性
jhat
主要是用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數(shù)量,大小等等,并支持對象查詢語言。
1.使用jmap命令導(dǎo)出堆文件jmap -dump:live,file=a.log pid
也可以使用下面方式導(dǎo)出堆文件
1、使用jconsole選項(xiàng)通過HotSpotDiagnosticMXBean從運(yùn)行時(shí)獲得堆轉(zhuǎn)儲(生成dump文件)、
2、虛擬機(jī)啟動時(shí)如果指定了-XX:+HeapDumpOnOutOfMemoryError選項(xiàng), 則在拋出OutOfMemoryError時(shí), 會自動執(zhí)行堆轉(zhuǎn)儲。
3、使用hprof命令
2.使用jhat分析堆文件jhat -J-Xmx512M a1.log
3.查看分析的html頁面
如果需要根據(jù)某些條件來過濾或查詢堆的對象,這是可能的,可以在jhat的html頁面中執(zhí)行OQL,來查詢符合條件的對象
基本語法:
select
>
解釋:
(1)class name是java類的完全限定名,如:java.lang.String,java.util.ArrayList, C是char數(shù)組,java.io.File是java.io.File
(2)類的完全限定名不足以唯一的辨識一個(gè)類,因?yàn)椴煌腃lassLoader載入的相同的類,它們在jvm中是不同類型的
(3)instanceof表示也查詢某一個(gè)類的子類,如果不明確instanceof,則只精確查詢class name指定的類
(4)from和where子句都是可選的
(5)java域表示:obj.field_name;java數(shù)組表示:array
舉例:
(1)查詢長度大于100的字符串
select s from java.lang.String s where s.count > 100
(2)查詢長度大于256的數(shù)組
select a from 256
(3)顯示匹配某一正則表達(dá)式的字符串
select a.value.toString() from java.lang.String s where /java/(s.value.toString())
(4)顯示所有文件對象的文件路徑
select file.path.value.toString() from java.io.File file
(5)顯示所有ClassLoader的類名
select classof(cl).name from instanceof java.lang.ClassLoader cl
(6)通過引用查詢對象
select o from instanceof 0xd404d404 o
built-in對象 — heap
(1)heap.findClass(class name) — 找到類
select heap.findClass(“java.lang.String”).superclass
(2)heap.findObject(object id) — 找到對象
select heap.findObject(“0xd404d404”)
(3)heap.classes — 所有類的枚舉
select heap.classes
(4)heap.objects — 所有對象的枚舉
select heap.objects(“java.lang.String”)
(5)heap.finalizables — 等待垃圾收集的java對象的枚舉
(6)heap.livepaths — 某一對象存活路徑
select heaplivepaths(s) from java.lang.String s
(7)heap.roots — 堆根集的枚舉
辨識對象的函數(shù)
(1)classof(class name) — 返回java對象的類對象
select classof(cl).name from instanceof java.lang.ClassLoader cl
(2)identical(object1,object2) — 返回是否兩個(gè)對象是同一個(gè)實(shí)例
select identical(heap.findClass(“java.lang.String”).name, heap.findClass(“java.lang.String”).name)
(3)objectid(object) — 返回對象的id
select objectid(s) from java.lang.String s
(4)reachables — 返回可從對象可到達(dá)的對象
select reachables(p) from java.util.Properties p — 查詢從Properties對象可到達(dá)的對象
select reachables(u, “java.net.URL.handler”) from java.net.URL u — 查詢從URL對象可到達(dá)的對象,但不包括從URL.handler可到達(dá)的對象
(5)referrers(object) — 返回引用某一對象的對象
select referrers(s) from java.lang.String s where s.count > 100
(6)referees(object) — 返回某一對象引用的對象
select referees(s) from java.lang.String s where s.count > 100
(7)refers(object1,object2) — 返回是否之一個(gè)對象引用第二個(gè)對象
select refers(heap.findObject(“0xd4d4d4d4”),heap.findObject(“0xe4e4e4e4”))
(8)root(object) — 返回是否對象是根集的成員
select root(heap.findObject(“0xd4d4d4d4”))
(9)sizeof(object) — 返回對象的大小
select sizeof(o) from
(10)toHtml(object) — 返回對象的html格式
select “+ toHtml(o) + “” from java.lang.Object o
(11)選擇多值
select {name:t.name?t.name.toString():”null”,thread:t} from instanceof java.lang.Thread t
數(shù)組、迭代器等函數(shù)
(1)concat(enumeration1,enumeration2) — 將數(shù)組或枚舉進(jìn)行連接
select concat(referrers(p),referrers(p)) from java.util.Properties p
(2)contains(array, expression) — 數(shù)組中元素是否滿足某表達(dá)式
select p from java.util.Properties where contains(referres(p), “classof(it).name == ‘java.lang.Class'”)
返回由java.lang.Class引用的java.util.Properties對象
built-in變量
it — 當(dāng)前的迭代元素
index — 當(dāng)前迭代元素的索引
array — 被迭代的數(shù)組
(3)count(array, expression) — 滿足某一條件的元素的數(shù)量
select count(heap.classes(), “/java.io./(it.name)”)
(4)filter(array, expression) — 過濾出滿足某一條件的元素
select filter(heap.classes(), “/java.io./(it.name)”)
(5)length(array) — 返回?cái)?shù)組長度
select length(heap.classes())
(6)map(array,expression) — 根據(jù)表達(dá)式對數(shù)組中的元素進(jìn)行轉(zhuǎn)換映射
select map(heap.classes(),”index + ‘–>’ + toHtml(it)”)
(7)max(array,expression) — 更大值, min(array,expression)
select max(heap.objects(“java.lang.String”),”lhs.count>rhs.count”)
built-in變量
lhs — 左邊元素
rhs — 右邊元素
(8)sort(array,expression) — 排序
select sort(heap.objects(‘
(9)sum(array,expression) — 求和
select sum(heap.objects(‘
(10)toArray(array) — 返回?cái)?shù)組
(11)unique(array) — 唯一化數(shù)組
jmap
打印進(jìn)程、核心文件或遠(yuǎn)程調(diào)試服務(wù)器的共享對象內(nèi)存映射或堆內(nèi)存詳細(xì)信息。
jmap
(to connect to running process) 連接到正在運(yùn)行的進(jìn)程
jmap
(to connect to a core file) 連接到核心文件
jmap
(to connect to remote debug server) 連接到遠(yuǎn)程調(diào)試服務(wù)
option
pid:目標(biāo)進(jìn)程的PID,進(jìn)程編號,可以采用ps -ef | grep java查看java進(jìn)程的PID;
executable:產(chǎn)生core dump的java可執(zhí)行程序;
core:將被打印信息的core dump文件;
remote-hostname-or-IP:遠(yuǎn)程debug服務(wù)的主機(jī)名或ip;
server-id:唯一id,假如一臺主機(jī)上多個(gè)遠(yuǎn)程debug服務(wù);
使用方法
jmap -dump:format=b,file= PID:使用hprof二進(jìn)制形式,輸出jvm的heap內(nèi)容到文件
jmap -finalizerinfo PID:打印正等候回收的對象的信息
jmap -heap PID:打印heap的概要信息,GC使用的算法,heap(堆)的配置及JVM堆內(nèi)存的使用情況。
jmap -histo:live PID:打印每個(gè)class的實(shí)例數(shù)目,內(nèi)存占用,類全名信息。VM的內(nèi)部類名字開頭會加上前綴”*”. 如果live子參數(shù)加上后,只統(tǒng)計(jì)活的對象數(shù)量.
jmap -permstat PID:打印classload和jvm heap長久層的信息. 包含每個(gè)classloader的名字、活潑性、地址、父classloader和加載的class數(shù)量。另外,內(nèi)部String的數(shù)量和占用內(nèi)存數(shù)也會打印出來。
-F強(qiáng)迫.在pid沒有相應(yīng)的時(shí)候使用-dump或者-histo參數(shù)。在這個(gè)模式下,live子參數(shù)無效。
-h | -help打印輔助信息
-J傳遞參數(shù)給jmap啟動的jvm.
jstack
jstack命令主要用于調(diào)試java程序運(yùn)行過程中的線程堆棧信息,可以用于檢測死鎖,進(jìn)程耗用cpu過高報(bào)警問題的排查。jstack命令會打印出所有的線程,包括用戶自己啟動的線程和jvm后臺線程。
命令格式
jstack – pid
option
-F強(qiáng)制dump線程堆棧信息. 用于進(jìn)程hung住,jstack命令沒有響應(yīng)的情況
-m同時(shí)打印java和本地(native)線程棧信息,m是mixed mode的簡寫
-l打印鎖的額外信
作者:楚瑞濤
公眾號“Java精選”所發(fā)表內(nèi)容注明來源的,版權(quán)歸原出處所有(無法查證版權(quán)的或者未注明出處的均來自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請聯(lián)系,筆者會之一時(shí)間刪除處理!
最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復(fù)“加群”,即可入群!
(微信小程序):3000+道面試題,包含Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)等,在線隨時(shí)刷題!
特別推薦
特別推薦:專注分享最前沿的技術(shù)與資訊,為彎道超車做好準(zhǔn)備及各種開源項(xiàng)目與高效率軟件的公眾號,「大咖筆記」,專注挖掘好東西,非常值得大家關(guān)注。點(diǎn)擊下方公眾號卡片關(guān)注。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧!
電氣工程及其自動化專業(yè)主要培養(yǎng)從事電氣工程及其自動化專業(yè)謹(jǐn)孝粗方面的研究、設(shè)計(jì)、運(yùn)行、實(shí)驗(yàn)、管理及開發(fā)等領(lǐng)域工作的高級技術(shù)人才。好單位9000、10000都可能,不好的地方3000,但要有好的收入還要有真才實(shí)學(xué)。
主要從事與電氣工程有關(guān)的系統(tǒng)運(yùn)行、自動控制、電力電子技術(shù)、信息處理、試驗(yàn)分析、研制開發(fā)、經(jīng)濟(jì)管理以及電子與計(jì)算機(jī)技術(shù)應(yīng)用等領(lǐng)域的工作。電氣自動化在工廠里應(yīng)用比較廣泛,可以這么說,電氣自動化是工廠里唯一缺少不了的東西,是工廠里的支柱。
你要是對電氣自動化比較精通,用人單位立刻要你,不管是什么單位,更好是電子廠,因?yàn)殡娮訌S天天用到自動化、編程、設(shè)計(jì)。如果你對工作待遇條件要求很看重。更好的是電業(yè)局。福利好,待遇高。然后是設(shè)計(jì)院,工作相對比較輕松。最艱苦的是工程局。因?yàn)橐S著工程地點(diǎn)到處跑。但是工資也不低。而且還可以向自動化、電子等方向轉(zhuǎn)行葉瞿直接無視瘋狂的文字泡,一臉正直地繼續(xù)揉面團(tuán):“把面團(tuán)放在砧板上,揉到光滑為止?!?/p>
“這樣可以了嗎?”粟望往面團(tuán)里加了點(diǎn)奶粉,學(xué)著葉瞿的樣子揉揉揉,戳一戳,好軟啊。
“可以了,把冰箱里的黃油片拿出來,我們來做酥皮?!比~瞿道,然后趁粟望去拿黃油的空檔對著鏡頭眨了眨慎伏眼,“粟粟是之一次上直播,妹子們矜持點(diǎn)別嚇到他哦?!?/p>
可想而知,又迎來一陣兇殘的刷屏。
黃油拿來后,葉瞿撕了一張保鮮膜平攤在料理臺上,把黃油放在上面,保鮮膜對折蓋住黃油,“記得這里用的黃油一定要是扁扁的一片,而且更好剛剛從冷藏柜里拿住來,防止因?yàn)槭覂?nèi)的溫度而變形融化。如果不夠扁,可以這樣用搟面杖一點(diǎn)點(diǎn)壓扁?!比~瞿拿著搟面杖,一點(diǎn)點(diǎn)用力,小心地把黃油壓得更扁更大。
而粟望突然拉拉他的袖子,“哥哥,黃油斷了?!?/p>
葉瞿:“……”
……
“刻被淚水侵占,“我們門當(dāng)戶對,一起留學(xué),交往了整整五年,為什么不能結(jié)婚!”
“對不起?!北绕鸷勿ǖ募?,葉瞿理清了思路后顯得格外平靜,“我以為我是喜歡你的,但是剛才……我突然醒悟,我們不能再錯(cuò)下去,我們分手吧?!?/p>
何皎皎什么話也說不出來,她死死盯著葉瞿,淚如雨下,“是不是因?yàn)樗谕??”她哽咽著控訴,“他出現(xiàn)之后,你對我的態(tài)度就冷淡了許多!”
“粟望是我弟弟,我們之間的事跟他沒有關(guān)系?!比~瞿無奈。
何皎皎咬著唇不說話,她也沒有證據(jù),但是她就是覺得葉瞿的注意力總是在粟望身上,讓她格外不祥鎮(zhèn)爽。
她胡亂抹了抹眼淚,往門口走去,搶在葉瞿阻止之前,打開大門。
“寶貝女兒,想媽媽了嗎?”穿著香奈兒套裝拿著枚紅色凱莉包包的何母敞開懷抱,對何皎皎眨了下眼睛。
何皎皎呆了一下,慌忙轉(zhuǎn)過臉去擦眼淚,何母迅速捧住她的臉,“你怎么哭了?是不是葉瞿欺負(fù)你了?”她本來滿心歡喜來看女兒,卻發(fā)現(xiàn)她滿臉淚痕,頓時(shí)心火大盛。
“阿姨,您好?!比~瞿也沒料到何母居然就在門外,反而是聽見動靜下來的馮翌反應(yīng)及時(shí),拉著何母往上發(fā)上去,“粟望,幫忙給阿姨倒杯茶?!?/p>
“哦?!彼谕徊饺仡^走向廚房,這人是誰?他滿腦袋問號。
“媽媽是來看我的?”何皎皎挽住何母的手臂,親昵地依著她的肩膀。
“我不來看你,難道任憑某些人欺負(fù)你?”何母話中有話,心疼地抓著何皎皎的手,“好好的怎么哭了?”
“沒事,跟葉瞿鬧了點(diǎn)別扭。”何皎皎小聲說道。
“我今天是來找葉瞿的?!焙文皋D(zhuǎn)過頭,優(yōu)雅地雙腿交疊對葉瞿道,“你讀個(gè)書五年不回來也就罷了,你跟皎皎也在一起五年了吧?我聽皎皎說她現(xiàn)在住你那兒,你是不是該有點(diǎn)表示?小夫妻倆吵吵架也
小仙丹立刻收斂了聲音,飛到他面前,軟下語調(diào)問道:“你跟凡人進(jìn)展得怎么樣了?”
“不怎么樣?!彼谕宦牭竭@個(gè)就煩,他躺下來卷起被子,悶頭繼續(xù)睡。
“喂,起來起來,我有個(gè)好辦法!”小仙丹飛到他耳朵邊說道。
粟望從被子里睜開一只眼睛,懷疑地看著小仙丹,“你又有什么餿主意了?”
“放心,嘻嘻,這次是個(gè)好主意?!毙∠傻g快得飛了兩圈,自豪地說到道,“你今天乖乖跟去農(nóng)家樂,到了那里就知道了!”北京千美健身休閑服務(wù)有限公司的統(tǒng)一社會信用代碼/注冊號是835N,企業(yè)法人顧英民,目前企業(yè)處于開業(yè)狀態(tài)。
北京千美健身休閑服務(wù)有限公司的經(jīng)營范圍是:器械健身;會議服務(wù)(不含食宿);餐飲管理;組織文化藝術(shù)交流活動(不含演出)。(企業(yè)依法自主選擇經(jīng)營項(xiàng)目,開展經(jīng)營活動;依法須經(jīng)批準(zhǔn)的項(xiàng)目,經(jīng)相關(guān)部門批準(zhǔn)后依批準(zhǔn)的內(nèi)容開展經(jīng)營活動;不得從事本市產(chǎn)業(yè)政策禁止和限制類項(xiàng)目的經(jīng)營活動。)。在北京市,相近經(jīng)營范圍的公司總注冊資本為萬元,主要資本集中在5000萬以上規(guī)模的企業(yè)中,共4173家。本省范圍內(nèi),當(dāng)前企業(yè)的注冊資本屬于一般。
美健的產(chǎn)品都是原生態(tài)純天然的,不添加化學(xué)物質(zhì),你只要試過就知道,完全就是原材料的高科技提取,純原生的味道,比如大豆TRIXCfjsWmOXtDlOvpfNqRgsakYn
檢枝沒查下你新建虛擬機(jī)的過程,1.檢查安裝虛擬機(jī)軟件的路徑,和建立虛擬機(jī)磁盤文件的路徑。
如何手動生存 hprof文件 linux
1.命令格式: top 2.命沒緩令功能: 顯示當(dāng)前系統(tǒng)正在執(zhí)行的進(jìn)程的相關(guān)信息,包括進(jìn)程ID、內(nèi)存占用率、CPU占用率等 3.命令參數(shù): -b
批處理
-c 顯示完整的治命令 -I 忽略失效過圓察空程 -s 保密模式 -S 累積模橘瞎式 -i 設(shè)置間隔時(shí)間 -u 指定
用戶名
關(guān)于linux hprof 分析工具的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
本文標(biāo)題:使用Linuxhprof分析工具進(jìn)行快速代碼優(yōu)化(linuxhprof分析工具)
文章轉(zhuǎn)載:http://m.fisionsoft.com.cn/article/dpcshdi.html


咨詢
建站咨詢
