JDKはJavaプログラマのためのプログラムが良いかの強力なツールの悪いパフォーマンスを実行している知っている間違いなく、監視システムのための多くの診断ツールがあります。
これらのツールは、JDKのbinディレクトリにあります。
JPS
Linuxのコマンドが呼ばれていてps
も、同様のJPS JDK、Javaのビュー実行中のプロセスを提供しながら、あなたは、システム上の現在のすべてのプロセスを表示することができます。
あなたは、コマンドのパラメータを見ることができます。
デフォルトでは、プロセスID、およびメインクラス名を含むJavaプロセスの出力を、JPS。
我々はまた、追加の情報を印刷するために追加のパラメータを渡すことができます。
例えば、モジュールの名前とパッケージの名前を印刷する-l;
-v Java仮想マシンに渡されたパラメータを印刷(例えば、-XX:+ UnlockExperimentalVMOptions -XX:+ UseZGC)。
-m印刷パラメータは、メインクラスに渡されます。
また-lvm使用を一緒に使用することができます。
JVMが開始したときにパラメータが使用される場合、それは、PERFDATAを格納するためのパーフォレーションメモリを作成する-XX:-UsePerfData
他のプロセスの可視禁止する、JPSコマンドは、Javaプロセスことを確認することができません。
JSTAT
JSTATコマンドは、Javaプロセスを印刷するためのデータを実行しています。
これは、サポート-class
クラスのロードに関連するデータを表示するために、-compiler
そして-printcompilation
情報にインタイムコンパイルを表示します。
だけでなく、-gc
ガベージコレクションなどに関連するデータ。
あなたは、サブコマンドとJava実行プロセスIDを指定する必要があります。
上の図は、二つの領域サバイバーの大きさを表すS0CとS1Cは、Cは容量、容量を意味します。
S0UとS1Uは、二つのサバイバー領域のサイズは、使用される、Uユーティリティを参照して、実用されているされています。
ECとEUは、エデン領域の容量と使用を表しています。
OCとOUは、旧地区の容量と使用を表しています。
MCとMUは、領域の容量と使用を表しています。
CCSCとはCCSUの圧縮ボリュームの大きさと空間の使用と比較的少数の使用を表しています。
YGCはYoungGCを表し、若い世代GCの数をより正確MinorGC、費やした時間のYGCTの代表と呼ばれるべき、たまたま、です。
FGC代表FullGC发生的次数,它发生在老年代,FGCT代表所用的时间。
GCT代表所有GC所占用的时间。
可以看到11次YGC只耗时0.439,而8次FGC却用了数倍时间,1.419。
现在我们已经知道每一个标记代表什么了,可以尝试一下使用更详细的gc子命令来查看对应Java进程了。
jstat命令默认执行一次只返回一次,如果我想一直监控某个Java进程,可以添加可以时间参数。
如下图,jstat -gcnew 13496 500
,后面跟一个500,就说明每500ms打印一次。
还可以指定打印的次数,比如jstat -gcnew 13496 500 5
,后面跟500 5
,就说明每500ms打印一次,总共打印5次。
在我们查看内存区域容量变化时,如果发现老年代的使用率不断增加,就说明有大量对象无法进行回收,我们的程序出现了性能上的问题。
再比如,我们可以添加-t
来打印程序运行时间Timestamp,如果GCT占据了大部分程序运行时间,或者说这个时间比在持续上升时。就说明我们程序的堆内存已经在逐步走向奔溃了。
Jmap
知道程序有了问题,我们就可以利用Jmap命令来分析了。
Jmap同样包括多条子命令。
-clstats
,该子命令将打印被加载类的信息。
-finalizerinfo
,该子命令将打印所有待 finalize 的对象。
-histo
,该子命令将统计各个类的实例数目以及占用内存,并按照内存使用量从多至少的顺序排列。此外,-histo:live只统计堆中的存活对象。
-dump
,该子命令将导出 Java 虚拟机堆的快照。同样,-dump:live只保存堆中的存活对象。
我们通常会利用jmap -dump:live,format=b,file=filename.bin
命令,将堆中所有存活对象导出至一个文件之中。
-heap
,该子命令将输出当前堆中的配置信息。
Jinfo
Jinfo命令可用来查看目标Java进程的参数。
Jstack
这是一个非常有用的命令,它可以用来打印目标 Java 进程中各个线程的栈轨迹,以及这些线程所持有的锁,所以这个命令可以帮助我们处理死锁。
シンプルなコードはデッドロックになるの書き込みましょう。
プログラムPaozhaopaozheデッドロックが発生します。
私たちは見てjstackを使用します。
私たちは、スレッド見ることができますThread-a
待機して待って、String.classにロックを施錠しましたMain.class
。
スレッドはThread-b
、それがロックされてMain.class
待機して待っています、String.class
。
Jstackでも発生し、デッドロックの原因を見つける私たちを助けます。