タグ:javaの、トラブルシューティング、モニター
一つの文にまとめ:高すぎるIOを解決する方法を、このような高いCPUなどのJavaオンラインアプリケーションの問題、メモリオーバーフロー、これを詳細に説明します。
1はじめに
ライン上で実行中のJavaアプリケーションの後、必然的に問題があるだろう、問題全体に4つのカテゴリに分類されます。
- (1)CPU関連の問題
- (2)メモリ関連の問題
- (3)ディスクIOと関連する問題
- (4)ビジネスコードの問題。
これらの問題を解決するには、どのようにオンライン監視とトラブルシューティング、必要なスキルのJava開発者です。以下で説明するいくつかの問題の前に述べたように、このルーチン調査と併せて以下のjavaコマンドラインツール。
2つのCPUのトラブルシューティングルーチン
システムが遅いカード、遅いアプリケーションの応答となり、最初に確認することがCPU使用率であれば、CPU集約型のプロセスは、一般的に高すぎると、CPU占有率を監視する必要がある、とCPUを持つJavaアプリケーションがスレッドに主に関連していますランニング、Javaアプリケーションに非常に具体的な、我々はコマンドラインツールに対応して監視スレッドを調整する必要がありますjstack
。次のルーチンによる高CPU問題の概要:
# (1) 查询CPU占用高的进程ID(PID)
top -c
# (2) 了解此进程的启动参数
ps -ef|grep PID
或者
jinfo -flags PID
# (3) 打印线程堆栈信息并输出文件
jstack -l PID > PID.dump
# (4) 根据进程查找线程ID(TID)
top -H -p PID
# (5) 获取TID的16进制数
printf "%x\n" TID
# (6) 结合TID和线程堆栈信息文件查找问题
- 可以使用文本工具直接查看
- 可以使用 grep TID -A20 PID.dump 来查看
- 需要配合线程状态来检查
复制代码
jstack
ツールや資料を表示するためのスレッド・ステータスの「Javaアプリケーションの監視(3) - 。あなたはそれをマスターしているこれらのコマンドラインツールを」
3つのメモリのトラブルシューティングルーチン
メモリーの問題など、いくつかのパラメータを、追加し、Javaアプリケーションが動作中に発生するため、アドバイスjavaアプリケーションの起動を必要とする(メモリ不足)OOMです-Xloggc:file -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/heapdump.hprof -XX:ErrorFile=logs/java_error_%p.log
。OOMが発生したときに、あなたはOOMの原因を分析するダンプファイルから出てくることができます。javaコマンドラインツールを含むメモリ関連の問題、jmap
、jstat
次のように、したがって、メモリOOMのトラブルシューティングルーチンは、次のとおりです。
# (1)找到java应用进程(PID)
jps -lvm
或者
top -c
# (2)了解此进程启动参数(特别是-Xms,-Xmx等)
ps -ef|grep PID
或者
jinfo -flags PID
# (3) 确认内存情况
jmap -heap PID
# (4) 查找占内存的大对象
jmap -histo:live PID
# (5) dump出堆文件,以便使用工具分析
jmap -dump:file=./heap.hprof PID
# (6) 查看GC变化情况,如下每秒打印一次
jstat -gc PID 1000
# (7) 结合日志文件出错信息及dump出来的堆文件分析OOM和GC情况
- 内存分配小,适当调整内存
- 对象被频繁创建,且不释放,优化代码
- young gc频率太高,查看-Xmn、-XX:SurvivorRatio等参数设置是否合理
复制代码
OOMについて、公式文書が OOMの指示を(持っているhttps://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html
)、それは、次のカテゴリに分類されています。
java.lang.OutOfMemoryError: Java heap space
ヒープメモリ使用量が達した-Xmx
最大設定が簡単に考えることができる調整することで、新しいオブジェクトを作成することはできません-Xmx
パラメータに対処します。java.lang.OutOfMemoryError: GC Overhead limit exceeded
Javaヒープ領域の割り当ては、ヒープに新しいデータほど小さくすることはできません、通常投げ、表現GCが行われているとjavaプロセスは非常に遅い実行しています。あなたは、出力パラメータがシャットダウンするために使用することができ閉じたい場合は、ヒープのサイズを調整することを検討-XX:-UseGCOverheadLimit
。java.lang.OutOfMemoryError: Requested array size exceeds VM limit
256M、512Mは、アレイを割り当てなければならないように、Javaアプリケーションは、アレイを割り当てる試みはヒープのサイズよりも大きい場合、ヒープ・サイズは、エラーが報告されています。コードのヒープサイズを調整したり、変更を検討java.lang.OutOfMemoryError: Metaspace
マシンはメモリの量を超えた場合、クラスのメタデータは、MaxMetaSpaceSizeの調整を検討する際MaxMetaSpaceSizeタイムズが必要。java.lang.OutOfMemoryError: request size bytes for reason. Out of swap space?
このエラーは、障害のローカルヒープとネイティブヒープから割り当てが枯渇に近いことができたとき、あなたがに対処するためのログをチェックする必要が報告されます。java.lang.OutOfMemoryError: Compressed class space
非スタック構造JVM、クラスポインタを検討し、十分な収納スペースでCompressedClassSpaceSize
調整します。java.lang.OutOfMemoryError: reason stack_trace_with_native_method
、JVM、Javaネイティブ・インターフェース(JNI)またはネイティブメソッドの割り振りの失敗が検出され、対応するクエリを見つけるために必要なスタック情報未満ネイティブメソッド領域。
4つのディスクIOとトラブルシューティングルーチン
Javaの実行中のプロセス・アプリケーションは、それがディスクのログ読み取りおよび書き込みや他の動作を生成することを含む、不十分なディスクなどの問題、様々ながあるかもしれない(過剰な出力をログ),,遅いディスクIOを読み書き、IOなどがあまりにも頻繁。一般的には、以下のルーチンを分離することができます。
# (1) 查看磁盘容量情况
df -h
# (2) 查看文件大小和目录大小
ls -l 或者直接ll
du -h --max-depth=1
# (3) 查看IO情况,找到IO读写频繁的进程PID
iotop -d 1 # 1秒打印一次
或者
iostat -d -x -k 1 #1秒打印一次
# (4) 使用stack打印线程堆栈信息,排查IO相关代码
# (5) 有时候若想测试磁盘的读写速度(特别是虚拟机),可以使用dd
# 示例:测数据卷挂载目录的纯写速度
dd if=/dev/zero of=/数据卷目录/test.iso bs=8k count=1000000
复制代码
5日常業務のトラブルシューティング
次のようにコードのロジック・レベルに主に関連するビジネス上の問題、主にクエリのログ出力、ロジックの正しい方法かどうか、それは一般的にルーチン調査です。
# (1) 实时日志输出查询
tail -fn 100 log_file
# (2) 根据日志输出的关键字来定位问题
grep keyWord log_file # 关键字所在行
grep -C n keyWord log_file # 关键字所在前后n行
# (3) 日志文件使用可视化文本工具分析(notepad++,sublime,大文件查看如EmEditor)
# (4) 使用线上工具直接检测方法的参数、返回值,异常情况等等,如Btrace,arthas等。
复制代码
Javaのオンライン診断ツールについての質問がBtraceとArthasは含ま記事に従います。このシリーズが導入されています。
概要6
この論文では4つのカテゴリーに分けラインJavaアプリケーション、すなわち(1)CPUの問題、(2)メモリ関連の問題に遭遇する問題、(3)及びディスクIOに関連する問題、(4)サービスコードの問題。javaコマンドラインツールと簡単にjavaアプリケーションに調査を行うことができるオンライン診断ツールと組み合わせて、特定のルーチンに従ってさまざまな問題、について。私は、適切なヘルプには、このJava開発者を願っています。
参考資料
-
OutOfMemoryErrorの例外を理解します:
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html
-
これは本当にハードコア技術聖なるキヤノンです。
https://mp.weixin.qq.com/s/NJPXFMgbwXWkzVLDK12Gfg
-
Javaルーチンのほとんどフルサービスのトラブルシューティング:
https://mp.weixin.qq.com/s/SuFPeWxtjHdXAcu6hkmBlA
-
JDKツールは、ドキュメントを参照します:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix
-
サンプルコード住所:
https://github.com/mianshenglee/my-example/tree/master/java-monitor-example
関連読書
- Javaアプリケーションの監視(1)-javaプログラマはアプリケーションの監視技術を認識しておく必要があり:
https://juejin.im/post/5d5fde94f265da03d42fae8b
- Javaアプリケーションの監視(2)-java secretコマンド:
https://juejin.im/post/5d60c8286fb9a06ada54bb87
- Javaアプリケーションの監視(3) -あなたはそれをマスターしているこれらのコマンドラインツール:
https://juejin.im/post/5d6207c6f265da03b46bf933