1. 程式人生 > >jmap基本用法和windows下定時任務執行

jmap基本用法和windows下定時任務執行

一、jmap基本用法
[b]jmap(java memory map)[/b]是jdk自帶的記憶體詳細資訊監控工具,jdk6之後在linux,unix或windows上都能使用,但在windows上功能有所限制。jmap在命令列上使用打印出執行的jvm或core檔案的記憶體統計資訊。如果不帶任何引數單獨使用jmap命令,那將打印出共享物件的列表。如果想看到更多指定的資訊,可以使用[color=red][b]-heap,-histo或-permstat[/b][/color]選項。

除此之外,jdk6開始還提供了[color=red][b]-dump:format=b,file=fileName[/b][/color]的選項,可以dump出記憶體的使用情況到一個指定檔名的二進位制檔案中。這個檔案可以配合jdk自帶的jhat工具或其他第三方工具來分析([b]jhat對於大的二進位制檔案分析耗時且響應慢,還有可能記憶體溢位,個人一般使用第三方mat外掛來分析[/b])。

如果jmap pid命令因為pid掛死而無響應,可以使用-F選項強制輸出([b]這個選項只能在Solaris和linux上使用[/b])。

[color=red][b]jmap是在Solaris os和linux版本中提供的功能,但jdk6之後的windows版本也提供了,不過只有jmap –dump:format=b,file=fileName和jmap –histo[:live] pid兩個選項可以使用。[/b][/color]

[b]1.0 jmap命令格式[/b]
[b]語法[/b]:
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [
[email protected]
]remote-hostname-or-IP

[b]引數說明:[/b]
1)options:

[b]executable[/b]:Java executable from which the core dump was produced.
[b]core[/b]: 將被列印資訊的core dump檔案
[b]remote-hostname-or-IP[/b]:遠端debug服務的主機名或ip
[b]server-id[/b]:唯一id,假如一臺主機上多個遠端debug服務

2)基本引數:
[b]-dump:[[color=red]live[/color],]format=b,file=<filename> [/b]使用hprof二進位制形式,輸出jvm的heap內容到檔案=. live子選項是可選的,假如指定live選項,那麼只輸出活的物件到檔案.

[b]-finalizerinfo [/b]列印正等候回收的物件的資訊.

[b]-heap [/b]列印heap的概要資訊,GC使用的演算法,heap的配置及wise heap的使用情況.

[b]-histo[:[color=red]live[/color]][/b] 列印每個class的例項數目,記憶體佔用,類全名資訊. VM的內部類名字開頭會加上字首”*”. 如果live子引數加上後,只統計活的物件數量.

[b]-permstat[/b] 列印classload和jvm heap長久層的資訊. 包含每個classloader的名字,活潑性,地址,父classloader和載入的class數量. 另外,內部String的數量和佔用記憶體數也會打印出來.

[b]-F [/b]強迫.在pid沒有相應的時候使用-dump或者-histo引數. 在這個模式下,live子引數無效.

[b]-h | -help[/b] 列印輔助資訊

[b]-J [/b]傳遞引數給jmap啟動的jvm.

[b]pid [/b]需要被列印配相資訊的java程序id,創業與打工的區別 - 博文預覽,可以用jps查問.

[b]1.1 堆記憶體配置和使用[/b] -heap
-heap選項可以獲取以下heap資訊:
1)gc資訊,包括gc演算法,並行gc使用的執行緒數等。
2)堆配置。包括jvm中設定的和啟動時指定的記憶體屬性配置,如最大最小設定等。
3)堆使用概要。如每一代記憶體的使用情況。

示例:
[b]$ jmap -heap 29620[/b]
輸出:
Attaching to process ID 29620, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.6.0-rc-b100

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 67108864 (64.0MB)
NewSize = 2228224 (2.125MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 4194304 (4.0MB)
NewRatio = 8
SurvivorRatio = 8
PermSize = 12582912 (12.0MB)
MaxPermSize = 67108864 (64.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 2031616 (1.9375MB)
used = 70984 (0.06769561767578125MB)
free = 1960632 (1.8698043823242188MB)
3.4939673639112905% used
Eden Space:
capacity = 1835008 (1.75MB)
used = 36152 (0.03447723388671875MB)
free = 1798856 (1.7155227661132812MB)
1.9701276506696428% used
From Space:
capacity = 196608 (0.1875MB)
used = 34832 (0.0332183837890625MB)
free = 161776 (0.1542816162109375MB)
17.716471354166668% used
To Space:
capacity = 196608 (0.1875MB)
used = 0 (0.0MB)
free = 196608 (0.1875MB)
0.0% used
tenured generation:
capacity = 15966208 (15.2265625MB)
used = 9577760 (9.134063720703125MB)
free = 6388448 (6.092498779296875MB)
59.98769400974859% used
Perm Generation:
capacity = 12582912 (12.0MB)
used = 1469408 (1.401336669921875MB)
free = 11113504 (10.598663330078125MB)
11.677805582682291% used
包含堆屬性的配置和各個代(HotSpot VM的記憶體是分代管理)記憶體的使用統計。


[b]1.2 執行程序的堆直方圖統計[/b] -histo
-histo選項可以用來獲取[b]基於類名的堆記憶體統計[/b]。可以輸出物件例項數量,記憶體統計和例項對應的類名。如果想獲取一個例項的大小,可以使用記憶體數除以對應的例項個數。
示例:
[b]$ jmap -histo 29620[/b]
輸出:
num #instances #bytes class name
--------------------------------------
1: 1414 6013016 [I
2: 793 482888 [B
3: 2502 334928 <constMethodKlass>
4: 280 274976 <instanceKlassKlass>
5: 324 227152 [D
6: 2502 200896 <methodKlass>
7: 2094 187496 [C
8: 280 172248 <constantPoolKlass>
9: 3767 139000 [Ljava.lang.Object;
10: 260 122416 <constantPoolCacheKlass>
11: 3304 112864 <symbolKlass>
12: 160 72960 java2d.Tools$3
13: 192 61440 <objArrayKlassKlass>
14: 219 55640 [F
15: 2114 50736 java.lang.String
16: 2079 49896 java.util.HashMap$Entry
17: 528 48344 [S
18: 1940 46560 java.util.Hashtable$Entry
19: 481 46176 java.lang.Class
20: 92 43424 javax.swing.plaf.metal.MetalScrollButton
... more lines removed here to reduce output...
1118: 1 8 java.util.Hashtable$EmptyIterator
1119: 1 8 sun.java2d.pipe.SolidTextRenderer
Total 61297 10152040

排序是按照每類例項使用總記憶體的降序。其中class name對應的就是Class檔案裡的class的標識:
[b]B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
S代表short
void用V表示
內部名就是帶全包路徑的表示法,例如String的內部名是java/lang/String
前邊有[代表陣列,[I 就相當於int[][/b]

物件用[L+類名錶示

[b]1.3 core檔案的堆直方圖統計[/b]
在core檔案上使用jmap –histo命令時可以輸出每個類的例項個數,大小和名稱。HotSpot vm的[b]自身的類名稱[/b]前面會帶字首*.

示例:
[b]& jmap -histo /net/koori.sfbay/onestop/jdk/6.0/promoted/all/b100/binaries/ solaris-sparcv9/bin/java core[/b]
輸出:
Attaching to core core from executable /net/koori.sfbay/onestop/jdk/6.0/
promoted/all/b100/binaries/solaris-sparcv9/bin/java, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 1.6.0-rc-b100
Iterating over heap. This may take a while...
Heap traversal took 8.902 seconds.

Object Histogram:

Size Count Class description
-------------------------------------------------------
4151816 2941 int[]
2997816 26403 * ConstMethodKlass
2118728 26403 * MethodKlass
1613184 39750 * SymbolKlass
1268896 2011 * ConstantPoolKlass
1097040 2011 * InstanceKlassKlass
882048 1906 * ConstantPoolCacheKlass
758424 7572 char[]
733776 2518 byte[]
252240 3260 short[]
214944 2239 java.lang.Class
177448 3341 * System ObjArray
176832 7368 java.lang.String
137792 3756 java.lang.Object[]
121744 74 long[]
72960 160 java2d.Tools$3
63680 199 * ObjArrayKlassKlass
53264 158 float[]
... more lines removed here to reduce output...

[b]1.4 獲取持久代(方法區)資訊[/b] -permstat
持久代儲存的是類資訊,方法資訊,字串池等。配置持久代記憶體大小對應用程式動態產生和載入大量類很重要。如果載入的類太多或太多的internalized字串就可能丟擲OutOfMemoryError。
可以使用-permstat選項輸出持久代記憶體的統計資訊。示例:
[b]$ jmap -permstat 29620[/b]
輸出:
Attaching to process ID 29620, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.6.0-rc-b100
12674 intern Strings occupying 1082616 bytes.
finding class loader instances ..Unknown oop at 0xd0400900
Oop's klass is 0xd0bf8408
Unknown oop at 0xd0401100
Oop's klass is null
done.
computing per loader stat ..done.
please wait.. computing liveness.........................................done.
class_loader classes bytes parent_loader alive? type

<bootstrap> 1846 5321080 null live <internal>
0xd0bf3828 0 0 null live sun/misc/
[email protected]

0xd0d2f370 1 904 null dead sun/reflect/[email protected]
0xd0c99280 1 1440 null dead sun/reflect/[email protected]
0xd0b71d90 0 0 0xd0b5b9c0 live java/util/[email protected]
0xd0d2f4c0 1 904 null dead sun/reflect/[email protected]

0xd0b5bf98 1 920 0xd0b5bf38 dead sun/reflect/[email protected]
0xd0c99248 1 904 null dead sun/reflect/[email protected]
0xd0d2f488 1 904 null dead sun/reflect/[email protected]
0xd0b5bf38 6 11832 0xd0b5b9c0 dead sun/reflect/misc/[email protected]
0xd0d2f338 1 904 null dead sun/reflect/[email protected]
0xd0d2f418 1 904 null dead sun/reflect/[email protected]
0xd0d2f3a8 1 904 null dead sun/reflect/[email protected]
0xd0b5b9c0 317 1397448 0xd0bf3828 live sun/misc/[email protected]
0xd0d2f300 1 904 null dead sun/reflect/[email protected]
0xd0d2f3e0 1 904 null dead sun/reflect/[email protected]
0xd0ec3968 1 1440 null dead sun/reflect/[email protected]
0xd0e0a248 1 904 null dead sun/reflect/[email protected]
0xd0c99210 1 904 null dead sun/reflect/[email protected]
0xd0d2f450 1 904 null dead sun/reflect/[email protected]
0xd0d2f4f8 1 904 null dead sun/reflect/[email protected]
0xd0e0a280 1 904 null dead sun/reflect/[email protected]

total = 22 2186 6746816 N/A alive=4, dead=18 N/A

[b]二、windows下定時執行jmap獲取資訊[/b]
linux下定時任務可以使用cron來實現,windows下倒是費了下工夫,沒有在控制面板配置定時任務,覺得使用命令列更好控制些。比如在windows下想定時執行jmap –histo和jmap –dump命令,則可以如下操作:

[b]step1:jmap_histo.bat[/b]
set filename=jmap_%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.txt
echo %filename%

jmap -histo:live 78104 > %filename%
exit


[b]step2:jmap_dump.bat[/b]
set filename=jmap_dump_%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.hprof
echo %filename%

jmap -dump:live,format=b,file=%filename% 78104


[b]step3:task.bat[/b]
@echo off

rem 指定要執行的bat檔案的路徑和名稱。
:loop
start /min jmap_histo.bat

rem 900是定時任務執行的間隔時間(單位:秒),這裡是15分鐘。其他不需要修改。
ping -n 900 127.1> nul
goto loop

[b]參考資料:[/b]
[url]http://www.oracle.com/technetwork/java/javase/tooldescr-136044.html[/url]
[url]http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html[/url]
[url]http://hbluojiahui.blog.163.com/blog/static/31064767201282091643613/[/url]
[url]http://developer.51cto.com/art/201203/321422.htm[/url]

相關推薦

jmap基本用法windows定時任務執行

一、jmap基本用法[b]jmap(java memory map)[/b]是jdk自帶的記憶體詳細資訊監控工具,jdk6之後在linux,unix或windows上都能使用,但在windows上功能有所限制。jmap在命令列上使用打印出執行的jvm或core檔案的記憶體統計

解決一個特定的負載均衡定時任務執行多次的問題

nginx負載均衡 項目 post 緩存 日期 多少 size edi 開始 項目每天晚上有個定時任務,把redis緩存數據重新連接數據庫刷新一遍,耗時大約40分鐘。但問題是項目是nginx負載均衡,這個定時任務會執行多次。經過一些思考之後,用以下辦法解決: redis裏加

Windows建立定時任務執行Python指令碼

在windows 中如何定時執行一個python指令碼? 解決方法是:使用windows 的“任務計劃程式” 第一步:在 計算器右擊 --> 選擇管理 進入如下介面: 第二步:選擇 系統工具 -->  任務計劃程式 ,點選右側的  “建立基本任務”,進入

windows設定定時任務執行ThinkPHP框架程式

在瀏覽器環境下通過url訪問執行執行是,是通過Apache來呼叫PHP的,所以此時的載入的php.ini是在D:\wamp\bin\apache\apache2.4.9\bin\目錄下的。而在命令列執行時,是直接通過PHP來執行程式的,所以此時載入的php.ini檔案是在PHP的安裝目錄下的,即D:\wamp

windowsLinux定時啟動或關閉服務

ref sta article start 處理程序 window pin blog win http://blog.csdn.net/clare504/article/details/17410643 1、Windows下的定時啟動程序可以采用系統的計劃和任務,定時

WindowsKettle定時任務執行併發送錯誤資訊郵件

Windows下Kettle定時任務執行併發送錯誤資訊郵件 1.首先安裝JDK 2.配置JDK環境 3.下載並解壓PDI(kettle) 目前我用的是版本V7的,可以直接百度搜索下載社群版,企業版收費,社群版免費 下載地址:https://sourceforge.net/projects/penta

MAC OSLinux的crontab實現定時任務(執行python等指令碼)

前言 crontab命令常見於Unix和類Unix的作業系統中,用於設定週期性被執行的指令。該命令從標準輸入裝置讀指令,並將其存入到“crontab”檔案中,以供之後讀取和執行。 使用方法 1.crontab -e 編輯自定義自己的任務,儲存退出後自動新增到cron

Liunx(centos8)的yum的基本用法例項

yum 命令 Yum(全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及CentOS中的Shell前端軟體包管理器。基於RPM包管理,能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關係,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安

linuxwindows安裝python拓展包及requirement.txt安裝類庫

too tor == 引導 -cp mod flask utf addition http://blog.csdn.net/pipisorry/article/details/39902327python拓展包安裝直接安裝拓展包默認路徑:Unix(Linux)默認路徑:/

mysql數據庫在Linuxwindows免安裝實現以及框架開發碰到的問題

自動啟動 過程 root mil 是否 call 啟動頁 同時 ice 2017年7月23號下午5:20分,上周我根據自己的實際情況,總結了mysql數據庫在windows系統下和linux系統下免安裝版本的實現,以及在項目開發中遇到的數據庫報錯,今天整理出來,以供日後學習

集群環境定時任務調度問題與方案探討

執行 定時任務 集群 調度 摘要問題:從單機擴展到集群方案一:不做改造,直接擴展方案二:多處調度、一處執行方案三:一處調度、一處執行方案四:一處調度、多處執行方案五:多處調度、多處執行摘要從改造工作量、可用性、負載均衡、資源利用等方面,簡單介紹了幾種集群環境下定時任務調度的方案。問題:從單機擴

vscode基於LinuxWindowsc/c++的多文件編譯與連接

vscode c/c++ 有時寫寫小程序,又不想啟動2013,vscode就成了我的首選。剛接觸vscode的時候,跟著網上配置了一堆東西,總算能編譯C/C++了,但一涉及到多文件,我還得乖乖的打開vs2013。前些天在配置Linux上的vscode的時候,突然發現有網友在tasks.json

linuxwindowsTIME_WAIT過多的解決辦法

iss abs apach cti ack tps als improve increase http://www.51testing.com/html/48/202848-249774.html linux和windows下TIME_WAIT過多的解決辦法 http:

ios數組基本用法排序大全

end 數組 integer @property con ins str all script 由於我寫的時候用到了數組的排序,發現這篇文章不錯,推薦給大家。 文章來自:http://blog.csdn.net/daiyelang/article/details/187

nginx基本用法HTTPS配置

sources 訪問 作用 lis source 負載 tor 同時 resource nginx作用講解:1.反向代理:需要多個程序共享80端口的時候就需要用到反向代理,nginx是反向代理的一種實現方式。2.靜態資源管理:一般使用nginx做反向代理的同時,應該把靜態資

vim的基本用法參數

Linux 學習 參數 VIM簡介vi: Visual Interface,文本編輯器 文本:ASCII, Unicode 文本編輯種類: 行編輯器: sed 全屏編輯器:nano, vi vim - Vi Improved 其他編輯器: gedit 一個簡單的圖形編輯器 gvim

linux定時任務crontab

每一個 usr mil 不同 local soft mic 情況下 設備 CRONTAB概念/介紹 crontab命令用於設置周期性被執行的指令。該命令從標準輸入設備讀取指令,並將其存放於“crontab”文件中,以供之後讀取和執行。 cr

iptables基本用法linux網絡相關

ttl 來源 sts network star odi 設備 進行 設置 ifconfig 命令 ifconfig在centos6中是默認安裝的,centos7版本默認是沒有這個命令的,需要使用yum來進行安裝: yum install net-tools使用ifdown和

sigar在CentosWindows使用java系統軟硬件配置信息

-c http key img use localhost per 64位 mas 背景 本來這個網上一大堆實在沒什麽想寫的,但是好像大多數都是互相抄襲的,在centos根本上用不了,因此我整理下自己具體實現的步驟。 使用環境 sigar版本:hyperic-siga

git 的基本用法常用命令

pst js文件 reset html 登陸 git倉庫 配置 php onf Git常用命令 請確保已經安裝裏git客戶端 一般配置 git --version //查看git的版本信息 git config --global user.name //獲取當