JDK的命令行工具系列 (二) javap、jinfo、jmap

来源:https://www.cnblogs.com/qingshanli/archive/2018/07/16/9315649.html
-Advertisement-
Play Games

javap: 反編譯工具, 可用來查看java編譯器生成的位元組碼 參數摘要: -help 幫助 -l 輸出行和變數的表 -public 只輸出public方法和域 -protected 只輸出public和protected類和成員 -package 只輸出包,public和protected類和成 ...


javap: 反編譯工具, 可用來查看java編譯器生成的位元組碼

參數摘要:

  • -help 幫助
  • -l 輸出行和變數的表
  • -public 只輸出public方法和域
  • -protected 只輸出public和protected類和成員
  • -package 只輸出包,public和protected類和成員,這是預設的
  • -p -private 輸出所有類和成員
  • -s 輸出內部類型簽名
  • -c 輸出分解後的代碼,例如,類中每一個方法內,包含java位元組碼的指令
  • -verbose 輸出棧大小,方法參數的個數
  • -constants 輸出靜態final常量

 代碼清單:

import java.awt.*;
import java.applet.*;

public class DocFooter extends Applet {
        String date;
        String email;

        public void init() {
                resize(500,100);
                date = getParameter("LAST_UPDATED");
                email = getParameter("EMAIL");
        }

        public void paint(Graphics g) {
                g.drawString(date + " by ",100, 15);
                g.drawString(email,290,15);
        }
}

命令行下輸入javap DocFooter, 結果如下: 

D:\cn\javaCommand>javap DocFooter
Compiled from "DocFooter.java"
public class DocFooter extends java.applet.Applet {
  java.lang.String date;
  java.lang.String email;
  public DocFooter();
  public void init();
  public void paint(java.awt.Graphics);
}

jinfo: Java配置信息工具

慣例, 先啟動一個java應用程式, 通過jps命令查看java進程的pid為14568, 命令行下輸入jinfo -J-d64 -sysprops 14568。這裡的 -J-d64 參數對應64位虛擬機。

C:\Users\liqingshan>jinfo -J-d64 -sysprops 14568
Attaching to process ID 14568, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.161-b12
sun.boot.library.path = E:\javaTools\jre\bin
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = ;
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level =
sun.java.launcher = SUN_STANDARD
user.script =
user.country = CN
user.dir = D:\cn\javaCommand
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.8.0_161-b12
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = E:\javaTools\jre\lib\endorsed
line.separator =

java.io.tmpdir = C:\Users\LIQING~1\AppData\Local\Temp\
java.vm.specification.vendor = Oracle Corporation
user.variant =
os.name = Windows 10
sun.jnu.encoding = GBK
java.library.path = C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\ProgramData\Oracle\Java\javapath;C:\oracle\product\10.2.0\db_1\bin;E:\javaTools\jdk1.8.0_161\bin;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;c:\Program Files\Intel\WiFi\bin\;C:\Java\MySQL\MySQL Server 5.5\bin;c:\Program Files\Common Files\Intel\WirelessCommon\;C:\Java\VisualSVN Server\bin;C:\Java\apache-maven-3.3.9\bin;E:\javaTools\apache-cxf-3.1.9\bin;E:\javaTools\Git\cmd;E:\javaTools\TortoiseGit\bin;E:\javaTools\mongodb\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\TortoiseSVN\bin;E:\javaTools\nodejs\;E:\Program Files\Bandizip\;C:\Users\liqingshan\AppData\Local\Microsoft\WindowsApps;C:\Users\liqingshan\AppData\Roaming\npm;.
java.specification.name = Java Platform API Specification
java.class.version = 52.0
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 10.0
user.home = C:\Users\liqingshan
user.timezone =
java.awt.printerjob = sun.awt.windows.WPrinterJob
file.encoding = GBK
java.specification.version = 1.8
user.name = qingshan
java.class.path = .
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = JpsDemo
java.home = E:\javaTools\jre
user.language = zh
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.windows.WToolkit
java.vm.info = mixed mode
java.version = 1.8.0_161
java.ext.dirs = E:\javaTools\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path = E:\javaTools\jre\lib\resources.jar;E:\javaTools\jre\lib\rt.jar;E:\javaTools\jre\lib\sunrsasign.jar;E:\javaTools\jre\lib\jsse.jar;E:\javaTools\jre\lib\jce.jar;E:\javaTools\jre\lib\charsets.jar;E:\javaTools\jre\lib\jfr.jar;E:\javaTools\jre\classes
java.vendor = Oracle Corporation
sun.stderr.encoding = ms936
file.separator = \
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.stdout.encoding = ms936
sun.desktop = windows
sun.cpu.isalist = amd64

另外網上找到的相關博客以及官方文檔都指明 JDK 1.8 之後已經不再支持jinfo命令, 但是在我本地 1.8 環境下卻支持, 這個先在這裡做個記錄, 待以後找到原因再完善本篇文章。

jmap: 生成heapdump文件

JDK的命令行工具系列 (一) jps、jstat中, 我們已經介紹過heapdump文件, 所以這裡就直接對jmap的命令和參數做個演示。其中關於具體參數的摘要說明轉載自H大的博客:  Java命令學習系列(三)——Jmap-HollisChuang's Blog

命令格式

  jmap [option] <pid>
    (to connect to running process)
  jmap [option] <executable <core>
    (to connect to a core file)
  jmap [option] [server_id@]<remote server IP or hostname>
    (to connect to remote debug server)

參數摘要

  • option 選項參數是互斥的(不可同時使用)。想要使用選項參數,直接跟在命令名稱後即可。
  • pid 需要列印配置信息的進程ID。該進程必須是一個Java進程。想要獲取運行的Java進程列表,你可以使用jps。
  • executable 產生核心dump的Java可執行文件。
  • core 需要列印配置信息的核心文件。
  • remote server IP or hostname 遠程調試伺服器的(請查看jsadebugd)主機名或IP地址。
  • server-id 可選的唯一id,如果相同的遠程主機上運行了多台調試伺服器,用此選項參數標識伺服器。

option

  • <no option> 如果使用不帶選項參數的jmap列印共用對象映射,將會列印目標虛擬機中載入的每個共用對象的起始地址、映射大小以及共用對象文件的路徑全稱。這與Solaris的pmap工具比較相似。
  • -dump:[live,]format=b,file=<filename> 以hprof二進位格式轉儲Java堆到指定filename的文件中。live子選項是可選的。如果指定了live子選項,堆中只有活動的對象會被轉儲。想要瀏覽heap dump,你可以使用jhat(Java堆分析工具)讀取生成的文件。
  • -finalizerinfo 列印等待終結的對象信息。
  • -heap 列印一個堆的摘要信息,包括使用的GC演算法、堆配置信息和generation wise heap usage。
  • -histo[:live] 列印堆的柱狀圖。其中包括每個Java類、對象數量、記憶體大小(單位:位元組)、完全限定的類名。列印的虛擬機內部的類名稱將會帶有一個’*’首碼。如果指定了live子選項,則只計算活動的對象。
  • -permstat 列印Java堆記憶體的永久保存區域的類載入器的智能統計信息。對於每個類載入器而言,它的名稱、活躍度、地址、父類載入器、它所載入的類的數量和大小都會被列印。此外,包含的字元串數量和大小也會被列印。
  • -F 強制模式。如果指定的pid沒有響應,請使用jmap -dump或jmap -histo選項。此模式下,不支持live子選項。
  • -h 列印幫助信息。
  • -help 列印幫助信息。
  • -J<flag> 指定傳遞給運行jmap的JVM的參數。

查看java堆的摘要信息: jmap -heap 11392

C:\Users\liqingshan>jps -m
11392 JpsDemo
12816
14352 Bootstrap start
6392 Jps -m
10060 Launcher C:/Java/IDEA/lib/guava-21.0.jar;C:/Java/IDEA/lib/jps-builders-6.jar;C:/Java/IDEA/lib/log4j.jar;C:/Java/IDEA/lib/httpcore-4.4.5.jar;C:/Java/IDEA/lib/netty-all-4.1.13.Final.jar;C:/Java/IDEA/lib/commons-codec-1.9.jar;C:/Java/IDEA/lib/annotations.jar;C:/Java/IDEA/lib/snappy-in-java-0.5.1.jar;C:/Java/IDEA/lib/trove4j.jar;C:/Java/IDEA/lib/jdom.jar;C:/Java/IDEA/lib/httpclient-4.5.2.jar;C:/Java/IDEA/lib/util.jar;C:/Java/IDEA/lib/openapi.jar;C:/Java/IDEA/lib/jps-model.jar;C:/Java/IDEA/lib/aether-dependency-resolver.jar;C:/Java/IDEA/lib/oromatcher.jar;C:/Java/IDEA/lib/forms_rt.jar;C:/Java/IDEA/lib/idea_rt.jar;C:/Java/IDEA/lib/resources_en.jar;C:/Java/IDEA/lib/protobuf-java-2.5.0.jar;C:/Java/IDEA/lib/asm-all.jar;C:/Java/IDEA/lib/jna.jar;C:/Java/IDEA/lib/jgoodies-forms.jar;C:/Java/IDEA/lib/javac2.jar;C:/Java/IDEA/lib/jps-builders.jar;C:/Java/IDEA/lib/slf4j-api-1.7.10.jar;C:/Java/IDEA/lib/aether-1.1.0-all.jar;C:/Java/IDEA/lib/commons-logging-1.2.jar;C:/Java/IDEA/lib/jna-platform.jar;C:/J

C:\Users\liqingshan>jmap -heap 11392
Attaching to process ID 11392, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12

using thread-local object allocation.
Parallel GC with 4 thread(s) //GC方式

Heap Configuration: //堆記憶體初始化配置
   MinHeapFreeRatio         = 0 //對應jvm啟動參數-XX:MinHeapFreeRatio設置JVM堆最小空閑比率(default 40)
   MaxHeapFreeRatio         = 100 //對應jvm啟動參數 -XX:MaxHeapFreeRatio設置JVM堆最大空閑比率(default 70)
   MaxHeapSize              = 2118123520 (2020.0MB) //對應jvm啟動參數-XX:MaxHeapSize=設置JVM堆的最大大小
   NewSize                  = 44564480 (42.5MB) //對應jvm啟動參數-XX:NewSize=設置JVM堆的‘新生代’的預設大小
   MaxNewSize               = 705691648 (673.0MB) //對應jvm啟動參數-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小
   OldSize                  = 89653248 (85.5MB) //對應jvm啟動參數-XX:OldSize=<value>:設置JVM堆的‘老生代’的大小
   NewRatio                 = 2 //對應jvm啟動參數-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8 //對應jvm啟動參數-XX:SurvivorRatio=設置年輕代中Eden區與Survivor區的大小比值
   MetaspaceSize            = 21807104 (20.796875MB) //對應jvm啟動參數-XX:MetaspaceSize=<value>:設置JVM堆的‘元空間’的初始大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB) //對應jvm啟動參數-XX:CompressedClassSpaceSize=<value>:設置類指針壓縮空間大小
   MaxMetaspaceSize         = 17592186044415 MB //對應jmv啟動參數-XX:MaxMetaspaceSize=<value>:設置JVM堆的'元空間'的最大大小
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage: //堆記憶體使用情況
PS Young Generation
Eden Space: //Eden區記憶體分佈
   capacity = 24641536 (23.5MB) //總容量
   used     = 492872 (0.47003936767578125MB) //已使用容量
   free     = 24148664 (23.02996063232422MB) //剩餘容量
   2.000167522024601% used //使用比例
From Space: //其中一個Survivor區的記憶體分佈
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
To Space: //另一個Survivor區的記憶體分佈
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
PS Old Generation //當前的老年代記憶體分佈
   capacity = 34603008 (33.0MB)
   used     = 674280 (0.6430435180664062MB)
   free     = 33928728 (32.356956481933594MB)
   1.9486167214133523% used

1577 interned Strings occupying 146816 bytes.

查看java堆的對象數量、記憶體大小、類的全限定名: jmap -histo:live 11392。其中 :live 參數會指定JVM先觸發一次GC之後, 再統計堆的柱狀圖。

C:\Users\liqingshan>jmap -histo:live 11392

 num     #instances         #bytes  class name
----------------------------------------------
   1:          2336         397136  [C
   2:           497          56704  java.lang.Class
   3:          2065          49560  java.lang.String
   4:           792          31680  java.util.TreeMap$Entry
   5:           529          30224  [Ljava.lang.Object;
   6:            10          25032  [B
   7:           388           9312  java.util.LinkedList$Node
   8:           195           8896  [Ljava.lang.String;
   9:           228           7296  java.util.HashMap$Node
  10:           195           6240  java.util.LinkedList
  11:           256           4096  java.lang.Integer
  12:            99           3960  java.lang.ref.SoftReference
  13:           117           3744  java.util.Hashtable$Entry
  14:            93           3616  [I
  15:            13           3088  [Ljava.util.HashMap$Node;
  16:             7           2632  java.lang.Thread
  17:             2           2080  [[C
  18:            38           1824  sun.util.locale.LocaleObjectCache$CacheEntry
  19:            51           1632  java.util.concurrent.ConcurrentHashMap$Node
  20:            20           1600  java.lang.reflect.Constructor
 .................................................. // 實際測試按num編號有187條記錄, 這裡只貼出了前20條記錄
Total          8528         674328

將Java堆的記憶體映像輸出到指定名稱的文件中: jmap -dump:format=b,file=qingshanli 11392, 然後輸入jhat命令啟動一個HTTP/HTML伺服器: jhat -port 10000 qingshanli

C:\Users\liqingshan>jmap -dump:format=b,file=qingshanli 11392
Dumping heap to C:\Users\liqingshan\qingshanli ...
Heap dump file created

C:\Users\liqingshan>jhat -port 10000 qingshanli
Reading from qingshanli...
Dump file created Mon Jul 16 19:50:18 GMT+08:00 2018
Snapshot read, resolving...
Resolving 562831 objects...
Chasing references, expect 112 dots................................................................................................................
Eliminating duplicate references................................................................................................................
Snapshot resolved.
Started HTTP server on port 10000
Server is ready.

在瀏覽器中輸入地址: http://localhost:10000, 就可以在頁面查看堆轉儲快照詳細信息。

參考資料

Java命令學習系列(七)——javap-HollisChuang's Blog

Java命令學習系列(六)——jinfo-HollisChuang's Blog

Java命令學習系列(三)——Jmap-HollisChuang's Blog 

《深入理解Java虛擬機》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 高可用 High availability is a characteristic of a system, which aims to ensure an agreed level of operational performance, usually uptime, for a higher t... ...
  • 知乎ID: 碼蹄疾 碼蹄疾,畢業於哈爾濱工業大學。 小米廣告第三代廣告引擎的設計者、開發者; 負責小米應用商店、日曆、開屏廣告業務線研發;主導小米廣告引擎多個模塊重構; 關註推薦、搜索、廣告領域相關知識; 題目 將兩個有序鏈表合併為一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成 ...
  • 一,異常和錯誤 part1:程式中難免出現錯誤,而錯誤分成兩種 1.語法錯誤(這種錯誤,根本過不了python解釋器的語法檢測,必須在程式執行前就改正) #語法錯誤示範一 if #語法錯誤示範二 def test: pass #語法錯誤示範三 print(haha 語法錯誤 2.邏輯錯誤(邏輯錯誤) ...
  • 前言 本篇文章主要介紹的是SpringBoot整合Netty以及使用Protobuf進行數據傳輸的相關內容。Protobuf會簡單的介紹下用法,至於Netty在 "之前的文章" 中已經簡單的介紹過了,這裡就不再過多細說了。 Protobuf 介紹 protocolbuffer(以下簡稱PB)是goo ...
  • 異常 學習異常的筆記記錄 異常 異常的概念 指的是程式在執行過程中,出現的非正常的情況,最終會導致JVM的非正常停止。 異常指的並不是語法錯誤,語法錯了,編譯不通過,不會產生位元組碼文件,根本不能運行. 異常的體系 簡單劃分下 : Throwable : java語言中所有異常和錯誤的超類 | Exc ...
  • 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關註我的微信公眾號: ,獲取優質學習資源。 一、登錄流程圖 二、小程式客戶端 微信小程式端發起登錄請求,攜帶的參數主要有: 參數解釋: code:loginRes.code,//臨時登錄憑證: 必傳 ,通過code來換取後臺的 和`openId` ...
  • mysql -uroot -p #登錄mysql命令password: #輸入密碼mysql> #每條mysql命令後面都要加分號結尾show databases; #列印整個mysql資料庫里的所有庫名use mysql; #進入資料庫 use 資料庫名 切換不同資料庫 #顯示所有表 tables ...
  • 更多情況下,我們查詢的數據來源於多張表,所有有必要瞭解一下MySQL中的連接查詢。 SQL中將連接查詢分成四類:交叉連接,內連接,外連接和自然連接。 數據準備 student表 class表 score表 交叉連接 交叉連接(CROSS JOIN)是用左表中的每一行與右表中的每一行進行連接,不能使用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...