2016-06-07 63 views
0

我想監視的Java在Linux CentOS系統8個進程,並能夠 看到他們正在使用多少內存。我寧願用外殼公用事業我要輸出最終反饋到我們的中央監控系統監控的Java 8進程看實際內存使用

我也通過java8這似乎對內存的使用量沒有影響-Xmx選項莫名其妙

這裏是一個腳本來獲得Java程序ps信息

for jvm in `sudo -u services jps|awk '/.jar/ {print $1}'`; do ps up $jvm;done 

輸出

USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
services 1409 0.0 10.8 4672536 872440 ?  Tl Jun03 3:53 /usr/java/lates 
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
services 1574 0.0 11.4 4743036 925536 ?  Sl Jun03 3:13 /usr/java/lates 
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
services 19839 0.7 10.9 4735664 881420 ?  Sl 09:43 0:15 /usr/java/lates 

這裏有一些設置FR OM程序

sudo -u services jps -lvm 
1409 /usr/local/content-adapters/pmc-adapter/pmc-adapter.jar -Xmx1024m -Xms512m 
1574 /usr/local/content-adapters/tools-adapter/tools-adapter.jar -Xmx512m 
20685 sun.tools.jps.Jps -lvm -Dapplication.home=/usr/java/jdk1.8.0_65 -Xms8m 
19839 /usr/local/content-adapters/cas-adapter/cas-adapter.jar 

在服務器默認

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize' 
    intx CompilerThreadStackSize     = 0         {pd product} 
    uintx ErgoHeapSizeLimit       = 0         {product} 
    uintx HeapSizePerGCThread      = 87241520       {product} 
    uintx InitialHeapSize       := 130023424       {product} 
    uintx LargePageHeapSizeThreshold    = 134217728       {product} 
    uintx MaxHeapSize        := 2063597568       {product} 
    intx ThreadStackSize       = 1024        {pd product} 
    intx VMThreadStackSize       = 1024        {pd product} 
java version "1.8.0_65" 
Java(TM) SE Runtime Environment (build 1.8.0_65-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode) 

如果我使用jstat,我不能讓各種「使用」數字加起來要麼4.5GiB VSZ上述數字的一些信息或800-900MiB RSS

我的問題是

  1. 我怎麼關聯的-Xmx和另一組使用實際內存的數量?
  2. 如何使用jstat顯示內存使用量?
  3. 想必在VSZ和RSS的差異是由於某種所有的Java程序中使用的共享資源。我如何估計或找到這個指標?

回答

2

除非設置了vm.overcommit_memory = 2,否則不應該太在意虛擬內存。保留的但不分配的地址空間和內存映射文件實現這一算,所以指標是幾乎無用由於Java保留整個堆事先要有一個連續的區域可用。

RSS通常更有趣,假設沒有發生尋呼應比當前分配的Java堆,其又可以比最大Java堆小(-Xmx)

假設最大堆容量略大未使用,只有少量的內存映射或直接字節緩衝區分配發生,無分頁發生的關係是這樣的:

非垃圾對象< Java堆使用< Java堆分配< RSS < Java堆保留( Xmx)< VSZ

+0

在我給的例子中,「tools-adapter.jar」有一個903MB的RSS,但是512M的Xmx--就像接近兩倍,所以關於我們正在運行的東西必須違揹你的假設 – Vorsprung

+0

在這種情況下,你可以使用'pmap'查找映射文件和[java的NMT(https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html)以查找非Java堆JVM的東西和堆轉儲來尋找直接的字節緩衝區。本地圖書館也是可能的罪魁禍首,但那些很難追蹤。 – the8472

+0

@Vorsprung:也許你的論點確實沒有影響?注意'java -Xfoo -jar bar.jar'和'java -jar bar.jar -Xfoo'之間的語義差異。不幸的是,當使用帶'-v'選項的'jps'時,兩者都打印完全一樣...... – Holger

0

此外Java將使用內存元空間中。另外,根據您的代碼,java可能會使用額外的內存來存儲字節緩衝區,直接內存。