web-dev-qa-db-ja.com

Javaヒープサイズと使用メモリを見つけるためのコマンドラインツール(Linux)

Javaアプリケーションのヒープサイズ(および使用済みメモリ)をチェックするためのコマンドラインツール(Linux)はありますか。

私はjmapを試しました。しかし、それは情報を与えます。 Eden/PermGenなどのような内部メモリ領域については、私にとっては役に立ちません。

私はのようなものを探しています:
最大メモリ:1GB
最小メモリ:256 MB
ヒープメモリ:700 MB
使用メモリ:460 MB

それで全部です。私はJConsoleなどでこれを見ることができますが、私はコマンドラインツールが必要です(JMXなどを有効にすることはできません)

そのようなツール/コマンドはありますか?

131
Jasper

各Javaプロセスにはpidがあり、最初にjpsコマンドで見つける必要があります。

Pidを取得したら、jstat -gc [insert-pid-here]を使用して、ガベージコレクションヒープの動作に関する統計情報を検索できます。

  • jstat -gccapacity [insert-pid-here]は、メモリプールの生成とスペースの機能に関する情報を表示します。

  • jstat -gcutil [insert-pid-here]は、各世代の使用率を容量のパーセンテージとして表します。使用状況を一目で確認するのに役立ちます。

Oracleのサイトの jstat docs を参照してください。

125
farmer1992

jvmtop は、ヒープを含むいくつかのメトリックでライブビューを提供するコマンドラインツールです。

VMオーバービューモードの出力例

 JvmTop 0.3 alpha (expect bugs)  AMD64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46
60
MRalwasser

このコマンドは、構成されたヒープサイズをバイト単位で表示します。

Java -XX:+PrintFlagsFinal -version | grep HeapSize

EC2上のAmazon AMIでも動作します。

50
Atma

UbuntuとRedHatでうまくいったことを試してみてください。

Java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Windowsの場合

Java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Mac用

Java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

これらすべてのコマンドの出力は、次のようになります。

uintx InitialHeapSize                          := 20655360        {product}
uintx MaxHeapSize                              := 331350016       {product}
uintx PermSize                                  = 21757952        {pd product}
uintx MaxPermSize                               = 85983232        {pd product}
intx ThreadStackSize                           = 1024            {pd product}
Java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)

サイズをMB単位で見つけるには、値を(1024 * 1024)で割ります。

29
padippist

ほとんどのツールで使用されているJMXを使用しなくても、できることはすべてuseです。

jps -lvm

そして設定がコマンドラインオプションから行われることを推測します。

デフォルトではJMXなしで動的な情報を取得することはできませんが、これを行うための独自のサービスを書くことができます。

ところで:私はJConsoleよりもVisualVMを使うことを好みます。

23
Peter Lawrey

視覚的な側面を持つコマンドラインツールがあります - jvm-mon 。それはdisaplysコマンドライン用のJVM監視ツールです。

  • ヒープ使用量、サイズおよび最大
  • jvmプロセス
  • cPUとGCの使い方
  • トップスレッド

ツールが開いている間、メトリックとチャートは更新されます。

サンプル:  jvm-mon

16
Andrejs

パーティーで遅くなりますが、非常に単純な解決策はjpsstat.shスクリプトを使用することです。シンプルなライブ 現在のメモリ 最大メモリ および cpu use detailsを提供します。

  • Goto GitHubプロジェクト および jpsstat.sh ファイルをダウンロードする
  • jpsstat.sh を右クリックしてpermissionsタブに移動し、実行可能にする
  • 次のコマンドを使用してスクリプトを実行します。 ./jpsstat.sh

これがscriptの出力例です -

=====  ======  =======  =======  =====
 PID    Name   CurHeap  MaxHeap  %_CPU
=====  ======  =======  =======  =====
2777   Test3      1.26     1.26    5.8
2582   Test1      2.52     2.52    8.3
2562   Test2      2.52     2.52    6.4
6
amarjeetAnand

どのアプローチでも、ほぼ同じ数になります。すべての世代に-X..m-X..xを使用してヒープを割り当てることは常に良い考えです。あなたはそれからどんなパラメータが渡され、それ故に使用されているかを見るためにpsを保証することもできます。

実際のメモリ使用量については、VIRT(割り当てられて共有されている)とRES(実際に使用されている)をjstat値と大まかに比較することもできます。

Java 8の場合、 jstat を参照してください。これらの値は実際には意味を持ちます。 mmapやファイル処理を行わずに単純なクラスを実行したとします。

$ jstat -gccapacity 32277
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
215040.0 3433472.0  73728.0  512.0  512.0  67072.0   430080.0  6867968.0   392704.0   392704.0      0.0 1083392.0  39680.0      0.0 1048576.0   4864.0   7225     2
$ jstat -gcutil 32277
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  6.25   0.00   7.96  18.21  98.01  95.29   7228   30.859     2    0.173   31.032

最大

     NGCMX + S0C + S1C + EC    + OGCMX   + MCMX    + CCSMX
   3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB

(おおよそVIRTメモリの近くと下)

最大(最小、使用済み):

215040 + 512 + 512 + 67072 + 430080  + 39680    +  4864  = ~ 1GB

(おおよそRESメモリに近い)

「これについては引用しないでください」しかしVIRT memは割り当てられた最大メモリにほぼ近いかそれ以上ですが、 使用されているメモリ が物理メモリ内で空き/使用可能である限り実際、OS上でスワップオフしても、JVM起動時に最大メモリが物理メモリに対してチェックされることはありません。 Javaプロセスが実際にどの仮想メモリを使用しているかについてのより良い説明は ここ で議論されています。

4
kisna

Java8以上 からは、下記のコマンドを使用できます。

jcmd Java_PROCESS_ID GC.heap_info

出力から、合計、使用済み、および使用済みメモリーを参照できます。

Sample Command And Output: jcmd 9758 GC.heap_info

PSYoungGen  total 1579520K, used 487543K [0x0000000751d80000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 1354240K, 36% used [0x0000000751d80000,0x000000076f99dc40,0x00000007a4800000)
  from space 225280K, 0% used [0x00000007b2400000,0x00000007b2400000,0x00000007c0000000)
  to   space 225280K, 0% used [0x00000007a4800000,0x00000007a4800000,0x00000007b2400000)
ParOldGen       total 3610112K, used 0K [0x0000000675800000, 0x0000000751d80000, 0x0000000751d80000)
  object space 3610112K, 0% used [0x0000000675800000,0x0000000675800000,0x0000000751d80000)
Metaspace       used 16292K, capacity 16582K, committed 16896K, reserved 1064960K
  class space    used 1823K, capacity 1936K, committed 2048K, reserved 1048576K

Jcmdコマンドの詳細については、次のリンクを参照してください。 https://docs.Oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

3
vaibhav gupta

最初にリストされたプロセスの最初の番号であるプロセスIDを次のいずれかから取得します(または、必要に応じてps aux | grep Javaを使用します)。

jps -lvm

その後、ここでプロセスIDを使用してください。

jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
2
sjas

topコマンドを使用するのがプログラムのメモリ使用量を確認する最も簡単な方法です。 RES列は、プロセスによって占有されている実物理メモリを示します。

私の場合は、10gファイルをJavaで読み込み、そのたびにoutOfMemory例外が発生しました。これは、RES列の値が-Xmxオプションで設定された値に達したときに起こりました。それから-Xmxオプションを使ってメモリを増やすことですべてうまくいきました。

1
M. Mashaye
jstat -gccapacity javapid  (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex.  stat -gccapacity 28745 550 10 )

上記コマンドのサンプルO/P

NGCMN    NGCMX     NGC     S0C  
87040.0 1397760.0 1327616.0 107520.0 

NGCMN   Minimum new generation capacity (KB).
NGCMX   Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).

これについての詳細は http://docs.Oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html にあります。

1
Pravin

Javaヒープサイズに関しては、Linuxでは、次のものを使用できます。

ps aux | grep Java

または

ps -ef | grep Java

-Xms、-Xmxを探して、指定された初期ヒープサイズと最大ヒープサイズを調べます。

ただし、興味のあるJavaプロセスに-Xmsまたは-Xmxが指定されていない場合は、Javaプロセスがデフォルトのヒープサイズを使用しているという意味です。次のコマンドを使って、デフォルトのサイズを調べることができます。

Java -XX:+PrintFlagsFinal -version | grep HeapSize

たとえば、特定のjvm

/path/to/jdk1.8.0_102/bin/Java -XX:+PrintFlagsFinal -version | grep HeapSize

initialHeapSizeとMaxHeapSizeを探します。これはバイト単位です。

1
Yuci

Jrockitを使用している場合は、jrcmdコマンドラインツールを試してください。例えば:

$ jrcmd 5127 print_memusage
5127:
Total mapped                  1074596KB           (reserved=3728KB)
-              Java heap       786432KB           (reserved=0KB)
-              GC tables        26316KB          
-          Thread stacks        13452KB           (#threads=34)
-          Compiled code         9856KB           (used=9761KB)
-               Internal          840KB          
-                     OS        15036KB          
-                  Other       146632KB          
-        Java class data        75008KB           (malloced=74861KB #103221 in 18709 classes)
- Native memory tracking         1024KB           (malloced=102KB #8)

Heap_diagnosticsのような他のコマンドについては、 "jrcmd help"を使用してそれらをリストしてください。

https://blogs.Oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t

1
guest

あなたが要求した形式でヒープメモリを印刷するツールは今までありません印刷する唯一の方法はJavaランタイムクラスの助けを借りたプログラム

public class TestMemory {

public static void main(String [] args) {

    int MB = 1024*1024;

    //Getting the runtime reference from system
    Runtime runtime = Runtime.getRuntime();

    //Print used memory
    System.out.println("Used Memory:" 
        + (runtime.totalMemory() - runtime.freeMemory()) / MB);

    //Print free memory
    System.out.println("Free Memory:" 
        + runtime.freeMemory() / mb);

    //Print total available memory
    System.out.println("Total Memory:" + runtime.totalMemory() / MB);

    //Print Maximum available memory
    System.out.println("Max Memory:" + runtime.maxMemory() / MB);
}

}

参照: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-Java-runtime/

0
Gowtham Prasath