Javaアプリケーションのヒープサイズ(および使用済みメモリ)をチェックするためのコマンドラインツール(Linux)はありますか。
私はjmapを試しました。しかし、それは情報を与えます。 Eden/PermGenなどのような内部メモリ領域については、私にとっては役に立ちません。
私はのようなものを探しています:
最大メモリ:1GB
最小メモリ:256 MB
ヒープメモリ:700 MB
使用メモリ:460 MB
それで全部です。私はJConsoleなどでこれを見ることができますが、私はコマンドラインツールが必要です(JMXなどを有効にすることはできません)
そのようなツール/コマンドはありますか?
各Javaプロセスにはpid
があり、最初にjps
コマンドで見つける必要があります。
Pidを取得したら、jstat -gc [insert-pid-here]
を使用して、ガベージコレクションヒープの動作に関する統計情報を検索できます。
jstat -gccapacity [insert-pid-here]
は、メモリプールの生成とスペースの機能に関する情報を表示します。
jstat -gcutil [insert-pid-here]
は、各世代の使用率を容量のパーセンテージとして表します。使用状況を一目で確認するのに役立ちます。
Oracleのサイトの jstat docs を参照してください。
jvmtop は、ヒープを含むいくつかのメトリックでライブビューを提供するコマンドラインツールです。
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
このコマンドは、構成されたヒープサイズをバイト単位で表示します。
Java -XX:+PrintFlagsFinal -version | grep HeapSize
EC2上のAmazon AMIでも動作します。
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)で割ります。
ほとんどのツールで使用されているJMXを使用しなくても、できることはすべてuseです。
jps -lvm
そして設定がコマンドラインオプションから行われることを推測します。
デフォルトではJMXなしで動的な情報を取得することはできませんが、これを行うための独自のサービスを書くことができます。
ところで:私はJConsoleよりもVisualVMを使うことを好みます。
視覚的な側面を持つコマンドラインツールがあります - jvm-mon 。それはdisaplysコマンドライン用のJVM監視ツールです。
ツールが開いている間、メトリックとチャートは更新されます。
パーティーで遅くなりますが、非常に単純な解決策はjpsstat.shスクリプトを使用することです。シンプルなライブ 現在のメモリ 、 最大メモリ および cpu use detailsを提供します。
これが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
どのアプローチでも、ほぼ同じ数になります。すべての世代に-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プロセスが実際にどの仮想メモリを使用しているかについてのより良い説明は ここ で議論されています。
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
最初にリストされたプロセスの最初の番号であるプロセスIDを次のいずれかから取得します(または、必要に応じてps aux | grep Java
を使用します)。
jps -lvm
その後、ここでプロセスIDを使用してください。
jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
top
コマンドを使用するのがプログラムのメモリ使用量を確認する最も簡単な方法です。 RES
列は、プロセスによって占有されている実物理メモリを示します。
私の場合は、10gファイルをJavaで読み込み、そのたびにoutOfMemory例外が発生しました。これは、RES
列の値が-Xmx
オプションで設定された値に達したときに起こりました。それから-Xmx
オプションを使ってメモリを増やすことですべてうまくいきました。
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 にあります。
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を探します。これはバイト単位です。
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
あなたが要求した形式でヒープメモリを印刷するツールは今までありません印刷する唯一の方法は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/