コマンドラインツールを使用してJavaヒープサイズと使用メモリを確認する(Linux)


171

Javaアプリケーションのヒープサイズ(および使用メモリ)を確認するコマンドラインツール(Linux)はありますか?

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

私は次のようなものを探しています:

  • 最大メモリ:1GB
  • 最小メモリ:256 MB
  • ヒープメモリ:700 MB
  • 使用済みメモリ:460 MB

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

そのようなツール/コマンドを知っていますか?

回答:


149

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

pidを取得したらjstat -gc [insert-pid-here]、ガベージコレクションされたヒープの動作の統計を見つけるために使用できます。

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

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

Oracleのサイトのjstatドキュメントを参照してください。


11
jstatJVMの全体的なメモリ使用量だけを確認するために、どのオプションを使用するべきかという推奨事項はありますか?たとえば、JVMを起動し、そのメモリをどれだけ使用しているかを確認したいXms=4gXmx=4gします。
basZero

1
「jstat -gcutil <pid> 250 N」は、250ms間隔でN個のサンプルを取得し、対応するスペースのパーセンテージとして出力を表示するのに非常に役立ちました。ありがとう。
ケレム2015年

3
以下からの引用を注目に値するjstatのOracleのJava 8のマニュアルページThis command is experimental and unsupported
patryk.beza

1
awk 'print {$3+$4+$6+$8}'Java 8のjstat列に要約された使用法を印刷できます
cybersoft

他の答えで問題がありましたが、基本的にps -ef | grep javaはvm引数が表示されました。私の場合、-Xmx値が含まれているため、必要なのはそれだけでした。
xdhmoore 2017年

66

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

これは確かに優れたツールであり、一種のhtopですが、jstatからのメトリックを備えています。提案をありがとう、@ MRalwasser。
oski86

65

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

java -XX:+PrintFlagsFinal -version | grep HeapSize

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


26
これは、プロセスのヒープ使用量を確認する方法を具体的に尋ねる質問には答えません。ここのコマンドは、すべてのプロセスにわたるJVMデフォルトをリストします。
Madbreaks、2016年

10
それでも、グローバルヒープサイズを確認する方法についてGoogle検索でこのページにアクセスするのは、非常に役立つ回答です。
ヨハン

@jumping_monkeyは間接的ではなく、正しくありません。あなたの言っていることが本当なら、答えを編集するか、新しい答えを自由に追加してください。
Madbreaks

42

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)で割ります。


pidで特定のJavaプロセスのヒープ、permsizeなどで区切られたメモリ使用量を見つける方法は?
ゲイリーガウ2017年

3
@GaryGauhこれはデフォルトのヒープサイズです。実行中のアプリケーションの使用状況を見つけるには、コード内で行うか、jconsoleを使用できます。これは他にも多くの方法があるはずだと私が知っていることです。
パピピスト2017年

2
jstat -gc <vmid>アプリケーションの実行に使用します。
Micha Wiedenmann、2018

27

ほとんどのツールで使用されているJMXを使用せずに、実行できることは

jps -lvm

そして、設定はコマンドラインオプションからのものであることを推測します。

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

ところで、私はJConsoleではなくVisualVMを使用することを好みます。


25

視覚的な側面を持つコマンドラインツール-jvm-monがあります。これは、不快感を与えるコマンドライン用のJVM監視ツールです。

  • ヒープ使用量、サイズ、最大
  • jvmプロセス
  • CPUとGCの使用
  • トップスレッド

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

サンプル: jvm-mon


1
jvm-monはJava8でのみ実行されることに注意してください
tmanolatos '

1
^今また、Java 11.サポートされていることを新しいバージョンがあります
Andrejs

11

パーティーは遅いですが、非常に簡単な解決策は、jpsstat.shスクリプトを使用することです。シンプルなライブ電流メモリ最大メモリCPU使用の詳細を提供します。

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

これがスクリプトのサンプル出力です-

=====  ======  =======  =======  =====
 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

SUSE Linuxではそのままでは機能しないようです(38行目:declare:-A:無効なオプション)
Chris

連想配列の宣言でエラーが発生するようですが、bash> = 4が必要です。また、スクリプトを "sh jpsstat.sh"として実行したことが原因で問題が発生することもあります。その場合は、「./ jpsstat.sh」としてスクリプトを実行してみてください。
amarjeetAnand 2017年

9

私の場合、ほとんどの基本的なユーティリティ(ps、pstree ...)がなかったDockerコンテナー内のフラグを確認する必要がありました。

使用jpsして、実行中のJVMのPID(私の場合1)jcmd 1 VM.flagsを取得し、実行中のJVMからフラグを取得しました。

利用できるコマンドによって異なりますが、これは誰かを助けるかもしれません。:)


8

Java8以上、あなたはコマンドの下に使用することができます:

jcmd JAVA_PROCESS_IDGC.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


1
コメントを修正する必要があります。GC.heap_infoは、Java 9以降で使用できます。:これは、Java 8を参照して、ここで別のスレッド利用できませんstackoverflow.com/questions/41891127/...
パベルMolchanov

@PavelMolchanov jdk1.8.0_172のコマンドを使用できます。/ライブラリ/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/bin/jcmd 98270 GC.heap_info。よろしければ、参照先のスレッドに情報を追加してください。コメントを追加できるほどの評判がありません。
vaibhav gupta

Macを使っていますか?Oracle JDKを使用していますか?jdk1.8.0_172でどのように利用できるかわかりません。Oracleはこの機能をJava 9以降でのみ文書化しました:docs.oracle.com/javase/9​​/tools/jcmd.htm。これは、Java 8のOracle JDKドキュメントには含まれていません。下部に示したリンクには含まれていません。docs.oracle.com
Pavel Molchanov

もう一つ質問。例ではプロセス98270を実行しているJDKバージョンを確認してください。jcmdは、プロセスのJVM(使用可能な場合は98270)から使用可能なコマンドを取得します。プロセス98270プロセスが異なるJDK(JDK 9以上)で実行されている場合、JCMD自体でもJava 8から利用できるGC.heap_infoコマンドが表示されます。使用可能なコマンドは、プロセスによって異なる場合があります。使用可能なコマンドを取得するには、jcmp <PID>ヘルプを実行します。
Pavel Molchanov

1
FWIW GC.heap_infoは、OpenJDK 8でも確実に利用できます。たぶん最近のバージョンだけですか?私はこれを使用しています:8u191-b12-2ubuntu0.18.04.1
Lundbergによる

7

どのアプローチでもほぼ同じ数になります。-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は割り当てられた最大メモリにほぼ近いかそれ以上ですが、使用されているメモリが物理メモリ内で空き/利用可能である限り、JVMはメモリ例外をスローしません。実際、OSでスワップをオフにしても、JVMの起動時に最大メモリは物理メモリに対してチェックされません。ここでは、Javaプロセスによって実際に使用される仮想メモリについてのより適切な説明について説明します


4

最初に、リストされたプロセスの最初の番号であるプロセス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

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

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


3
topコマンドは、JVMに与えられているOSの量を示しています。この人たちは、JVM内のヒープ領域の使用状況をどのように確認できるかを尋ねています。JVMが10gを使用しているということは、実際のヒープスペースが10gのデータでいっぱいであることを意味するわけではありません。
linehrr 2017

2

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

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
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

要求された形式でヒープメモリを印刷するツールは今のところありません。印刷する 唯一の方法は、ランタイムクラスを使用して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/


これは間違っています。jmap -heap <pid>がこの情報を提供します
vsingh

0

上からwebapp / javaプロセスのプロセスIDを見つけます。jmap heapを使用して、ヒープ割り当てを取得します。AWS-Ec2でElastic Beanstalkについてこれをテストしました

アプリケーションの最大ヒープが3 GB以下の画像で確認できます

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.