linuxjstat的簡單介紹

本文目錄一覽:

Linux使用jstat命令查看jvm的GC情況

Linux 使用jstat命令查看jvm的GC情況

命令格式

jstat命令命令格式:

jstat [Options] vmid[interval] [count]

參數說明:

Options,選項,我們一般使用 -gcutil 查看gc情況

vmid

,VM的進程號,即當前運行的java進程號

interval

,間隔時間,單位為秒或者毫秒

count

,列印次數,如果預設則列印無數次

示例說明

示例

通常運行命令如下:

jstat -gc 12538 5000

即會每5秒一次顯示進程號為12538的java進成的GC情況,

顯示內容如下圖:

結果說明

   S0C:年輕代中第一個survivor(倖存區)的容量 (位元組)

S1C

:年輕代中第二個survivor(倖存區)的容量 (位元組)

S0U

:年輕代中第一個survivor(倖存區)目前已使用空間 (位元組)

S1U

:年輕代中第二個survivor(倖存區)目前已使用空間 (位元組)

EC

:年輕代中Eden(伊甸園)的容量 (位元組)

EU

:年輕代中Eden(伊甸園)目前已使用空間 (位元組)

OC

:Old代的容量 (位元組)

OU

:Old代目前已使用空間 (位元組)

PC

:Perm(持久代)的容量 (位元組)

PU

:Perm(持久代)目前已使用空間 (位元組)

YGC

:從應用程序啟動到採樣時年輕代中gc次數

YGCT

:從應用程序啟動到採樣時年輕代中gc所用時間(s)

FGC

:從應用程序啟動到採樣時old代(全gc)gc次數

FGCT

:從應用程序啟動到採樣時old代(全gc)gc所用時間(s)

GCT

:從應用程序啟動到採樣時gc用的總時間(s)

NGCMN

:年輕代(young)中初始化(最小)的大小 (位元組)

NGCMX

:年輕代(young)的最大容量 (位元組)

NGC

:年輕代(young)中當前的容量 (位元組)

OGCMN

:old代中初始化(最小)的大小 (位元組)

OGCMX

:old代的最大容量 (位元組)

OGC

:old代當前新生成的容量 (位元組)

PGCMN

:perm代中初始化(最小)的大小 (位元組)

PGCMX

:perm代的最大容量 (位元組)

PGC

:perm代當前新生成的容量 (位元組)

S0

:年輕代中第一個survivor(倖存區)已使用的占當前容量百分比

S1

:年輕代中第二個survivor(倖存區)已使用的占當前容量百分比

E

:年輕代中Eden(伊甸園)已使用的占當前容量百分比

O

:old代已使用的占當前容量百分比

P

:perm代已使用的占當前容量百分比

S0CMX

:年輕代中第一個survivor(倖存區)的最大容量 (位元組)

S1CMX

:年輕代中第二個survivor(倖存區)的最大容量 (位元組)

ECMX

:年輕代中Eden(伊甸園)的最大容量 (位元組)

DSS

:當前需要survivor(倖存區)的容量 (位元組)(Eden區已滿)

TT

: 持有次數限制

MTT

: 最大持有次數限制

linux怎麼監控 jvm內存 jstat

jstat

可以觀察到classloader,compiler,gc相關信息

-class:統計class loader行為信息

-compile:統計編譯行為信息

-gc:統計jdk gc時heap信息

-gccapacity:統計不同的generations(不知道怎麼翻譯好,包括新生區,老年區,permanent區)相應的heap容量情況

-gccause:統計gc的情況,(同-gcutil)和引起gc的事件

-gcnew:統計gc時,新生代的情況

-gcnewcapacity:統計gc時,新生代heap容量

-gcold:統計gc時,老年區的情況

-gcoldcapacity:統計gc時,老年區heap容量

-gcpermcapacity:統計gc時,permanent區heap容量

-gcutil:統計gc時,heap情況

(詳見)

Linux系統監控要用到哪些命令

記錄一下自己常用的linux系統命令,方便以後查閱,發覺記憶越來越不行了

找到最耗CPU的java線程ps命令

命令:ps -mp pid -o THREAD,tid,time 或者 ps -Lfp pid

結果展示:

這個命令的作用,主要是可以獲取到對應一個進程下的線程的一些信息。 比如你想分析一下一個java進程的一些運行瓶頸點,可以通過該命令找到所有當前Thread的佔用CPU的時間,也就是這裡的最後一列。

比如這裡找到了一個TID : 30834 ,所佔用的TIME時間最高。

通過 printf “%x\n” 30834 首先轉化成16進位, 繼續通過jstack命令dump出當前的jvm進程的堆棧信息。 通過Grep命令即可以查到對應16進位的線程id信息,很快就可以找到對應最耗CPU的代碼快在哪。

簡單的解釋下,jstack下這一串線程信息內容:

“DboServiceProcessor-4-thread-295” daemon prio=10 tid=0x00002aab047a9800 nid=0x7d9b waiting on condition [0x0000000046f66000]

nid : 對應的linux操作系統下的tid,就是前面轉化的16進位數字

tid: 這個應該是jvm的jmm內存規範中的唯一地址定位,如果你詳細分析jvm的一些內存數據時用得上,我自己還沒到那種程度,所以先放下

top命令

命令:top -Hp pid

結果顯示:

和前面的效果一下,你可以實時的跟蹤並獲取指定進程中最耗cpu的線程。 再用前面的方法提取到對應的線程堆棧信息。

判斷I/O瓶頸

mpstat命令

命令:mpstat -P ALL 1 1000

結果顯示:

注意一下這裡面的%iowait列,CPU等待I/O操作所花費的時間。這個值持續很高通常可能是I/O瓶頸所導致的。

通過這個參數可以比較直觀的看出當前的I/O操作是否存在瓶頸

iostat命令

命令: iostat -m -x 1 1000

同樣你可以觀察對應的CPU中的%iowait數據,除此之外iostat還提供了一些更詳細的I/O狀態數據,比如比較重要的有:

avgqu-sz : The average queue length of the requests that were issued to the device. (磁碟隊列的請求長度,正常的話2,3比較好。可以和cpu的load一樣的理解)

await : The average time (in milliseconds) for I/O requests issued to the device to be served. (代表一個I/O操作從wait到完成的總時間)

svctm和%util都是代表處理該I/O請求花費的時間和CPU的時間比例。 判斷是否瓶頸時,這兩個參數不是主要的

r/s w/s 和 rMB/s wMB/s 都是代表當前系統處理的I/O的一些狀態,前者是我們常說的tps,後者就是吞吐量。這也是評價一個系統的性能指標

pid命令

命令: pidstat -p pid -u -d -t -w -h 1 1000

結果顯示:

相當實用的一個命令,可以基於當個進程分析對應的性能數據,包括CPU,I/O,IR , CS等,可以方便開發者更加精細化的觀察系統的運行狀態。不過pidstat貌似是在2.6內核的一些較新的版本才有,需要安裝sysstat包。

ubuntu下,可以通過sudo apt-get install sysstat進行安裝。

sar命令

命令:sar -x pid 1 1000

sar也可以指定對應的pid,關注固定的幾個參數,沒有pidstat那麼強大。 看不到對應的I/O, IR等信息。

sar的功能可以覆蓋mpstat , iostat的相關功能。

dstat命令

命令:dstat -y –tcp 1 1000

通過dstat –tcp可以比較方便的看到當前的tcp的各種狀態,不需要每次netstat -nat去看

其他命令

netstat -natp : 查看對應的網路鏈接,關注下Recv-Q , Send-Q , State。

lsof -p pid : 查找對應pid的文件句柄

lsof -i : 80 : 查找對應埠被哪個進程佔用

lsof /tmp/1.txt :查找對應文件被哪個進程佔用

tcpdump / wireshark :抓包分析工具

jstat / jmap / jstack / jps 等一系列的java監控命令

最後

如果你想做一些性能調優的工作,一定要善於利用一些工具進行關注相應的狀態。通過linux命令你可以比較方便的觀測到CPU , I/O , network等一些比較外圍的狀態, 很多時候就已經可以解決大部分的問題。jvm內部的一些運行狀態監控,得需要藉助一些特有的工具進行細粒度的觀測。

linux上如何安裝jstatd服務

此命令是一個RMI Server應用程序,提供了對JVM的創建和結束監視,也為遠程監視工具提供了一個可以attach的介面

options

-nr 當一個存在的RMI Registry沒有找到時,不嘗試創建一個內部的RMI Registry

-p port 埠號,默認為1099

-n rminame 默認為JStatRemoteHost;如果多個jstatd服務開始在同一台主機上,rminame唯一確定一個jstatd服務

-J jvm選項

jstatd

會報如下錯誤:

Could not create remote object access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.System.setProperty(System.java:727) at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

這是因為沒有給jstatd指定安全策略

創建安全策略文件,並命名為jstatd.all.policy

grant codebase “file:${java.home}/../lib/tools.jar” {

permission java.security.AllPermission;

};

再次啟動

C:\Program Files\Java\jdk1.6.0_16\binjstatd -J-Djava.security.policy=jstatd.all.policy

利用jps查看正在運行的java命令

jps

C:\Documents and Settings\lulujps

4892 Bootstrap

1296 Jstatd

4484 Jps

3332 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar

此時就可以使用jvisualvm.exe以遠程的方式監控JVM相關信息了。

更多例子

(1)使用內部RMI Registry

jstatd -J-Djava.security.policy=all.policy (默認埠為1099)

(2)使用外部RMI Registry

a)使用默認值

rmiregistry

jstatd -J-Djava.security.policy=all.policy

b)使用2020埠

rmiregistry 2020

jstatd -J-Djava.security.policy=all.policy -p 2020

c)使用2020埠,使用rminame

rmiregistry 2020

jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName

(3)RMI Registry已經啟動,不創建內部RMI Registry

jstatd -J-Djava.security.policy=all.policy -nr

(4)RMI日誌能力

jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true

原創文章,作者:ETFJQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/315721.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ETFJQ的頭像ETFJQ
上一篇 2025-01-09 12:14
下一篇 2025-01-09 12:14

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進位下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27

發表回復

登錄後才能評論