この記事では、主に Java 仮想マシン (JVM) の関連コンテンツと、Java プログラムの実行メカニズムとエラー分析について説明します。必要な方はさらに詳しく学ぶことができます。
JVM (Java Virtual Machine) さまざまな方法 (ソフトウェアまたはハードウェア) で実装できるコンピューティング デバイスの仕様。仮想マシンの命令セットのコンパイルは、マイクロプロセッサの命令セットのコンパイルと非常に似ています。 Java 仮想マシンには、バイトコード命令のセット、レジスターのセット、スタック、ガベージ コレクション ヒープ、およびストレージ メソッド フィールドが含まれます。
Java 仮想マシン (JVM) は、Java コードを実行できる架空のコンピューターです。インタプリタが JVM 仕様に従って特定のコンピュータに移植されている限り、コンパイルされた Java コードはすべてそのシステム上で実行されることが保証されます。
1. Java 仮想マシンを使用する理由
Java 言語の非常に重要な特徴は、プラットフォームからの独立性です。この機能を実現するには、Java 仮想マシンの使用が鍵となります。一般的な高級言語を異なるプラットフォームで実行したい場合は、少なくとも異なるターゲット コードにコンパイルする必要があります。 Java 言語仮想マシンの導入後は、別のプラットフォームで実行するときに Java 言語を再コンパイルする必要はありません。 Java 言語の使用モデル Java 仮想マシンは特定のプラットフォームに関連する情報をシールドするため、Java 言語コンパイラーは Java 仮想マシン上で実行されるターゲット コード (バイトコード) を生成するだけで済み、変更を加えずに複数のプラットフォーム上で実行できます。 Java 仮想マシンはバイトコードを実行するときに、そのバイトコードを特定のプラットフォームで実行するためのマシン命令に解釈します。
Java 実行メカニズム
Java プログラムの実行には、作成、コンパイル、実行という 3 つのステップを経る必要があります。
書き込みとは、Java 開発環境にプログラム コードを入力し、最終的に拡張子 .java が付いた Java ソース ファイルを形成することを指します。
コンパイルとは、最終的に実行可能ファイルを生成する C 言語とは異なり、Java コンパイラーを使用してソース ファイルのトラブルシューティングを行うプロセスを指します。コンパイル後、拡張子 .class が付いたバイトコード ファイルが生成されます。
実行とは、Javaインタプリタを使用してバイトコードファイルをマシンコードに変換し、実行して結果を表示することを指します
バイトコードファイルは、特定のマシン環境やオペレーティングシステム環境とは何の関係もない中間コードです。バイナリファイルとは、JavaソースファイルがJavaコンパイラによってコンパイルされた後に生成されるオブジェクトコードファイルです。プログラマもコンピュータもバイトコード ファイルを直接読み取ることはできません。そのため、Java はコンパイルに基づいて解釈および実行される言語です。
Java インタプリタは、特定のハードウェア環境および実行用のオペレーティング システム プラットフォームの下で、バイトコード ファイルをマシンコードに変換する役割を果たします。したがって、Java プログラムは既存のオペレーティング システム プラットフォーム上で直接実行することはできず、Java 仮想マシンと呼ばれるソフトウェア プラットフォーム上で実行する必要があります。
Java 仮想マシン (JVM) は Java プログラムを実行するためのソフトウェア環境であり、Java インタープリタは Java 仮想マシンの一部です。 Java プログラムを実行する場合、最初に JVM が起動され、次に Java バイトコードの解釈と実行を担当します。Java バイトコードは JVM 上でのみ実行できます。このように、JVM を使用して、Java バイトコード プログラムを特定のハードウェア プラットフォームおよびオペレーティング システム環境から分離できます。特定のプラットフォーム用の JVM が別のコンピュータにインストールされている限り、Java プログラムは現在の特定の環境を考慮せずに実行できます。ハードウェア プラットフォームとオペレーティング システム環境では、バイトコード ファイルが生成されたプラットフォームを考慮する必要はありません。 JVM は、さまざまなソフトウェア プラットフォームとハードウェア プラットフォーム間の具体的な違いを隠し、それによって真のバイナリ コード レベルのクロスプラットフォーム移植を実現します。 JVM は、プラットフォームに依存しない Java の基盤であり、Java のクロスプラットフォーム機能は、JVM で Java プログラムを実行することによって実現されます。
Java 言語の「一度書いたらどこでも実行できる」アプローチ は、現在の高水準プログラミング言語のほとんどが、異なるシステムに対して異なるマシンコードを生成するためにコンパイルする必要があるという問題、つまりハードウェアの異種問題を効果的に解決します。環境とオペレーティング プラットフォームにより、プログラムの開発、保守、管理のオーバーヘッドが大幅に削減されます。
Java プログラムは JVM を通じてクロスプラットフォーム機能を実現できますが、JVM はクロスプラットフォームではないことに注意してください。つまり、異なるオペレーティング システム上の JVM は異なり、Windows プラットフォーム上の JVM は Linux 上では使用できません。また、その逆も同様です。
JAVA プログラムの実行エラー分析
一般に、稼働中の大規模プロジェクトでは、最大で次のような問題が発生する可能性があります。
1. CPU 使用率の異常
1) CPU 使用率、ターゲット プロセスの使用率を調べてから、各コアの使用率を確認します。これは、単一スレッドの問題なのかスレッド プールの問題なのかを特定するのに役立ちます。
2) プログラムが一定期間正常に実行された後、CPU が突然垂直方向に上昇することがあります。これは、プログラム内のロックに関連している可能性があります (ロックが短時間保持されている場合は、より良い状態になります)。 cas+yield を試してスピン ロックを実装してください)
3) デッドロックの場合は、呼び出しスタックを直接エクスポートして問題の解決策を見つけます。
2. 異常なメモリ
1) メモリリーク、言うまでもなく、問題を見つけるためにスタックをダンプします
2) 頻繁な GC もパフォーマンス不足につながります。プログラム内で GC が頻繁に発生する場合は、新しい世代のサイズを増やしても問題が解決しない場合は、注意が必要です。一時オブジェクトの作成 (メモリの繰り返し適用を避けるためにオブジェクト プール テクノロジーを使用できます)
3. 特定のワーカー スレッドの予期せぬ終了
1) 開いているファイル、IO を確認します。操作占有およびディスク使用量。 df iostat などのコマンドを使用できます
2) 監視やネットワークの使用状況を占有しているプログラムがあるかどうかを確認するには、netstat などのコマンドを使用できます
1 .jmap
jmap pid デフォルトで JAVA を表示します
jmap -histo pid メモリ内のアクティブなインスタンスの数を確認します
jmap -dump:format=b,file=(file name) pid Java プログラムのメモリを完全にエクスポートします。完全な分析は、プログラムの初期化後に jmap -dump:format=b,file=a.bin を 1 回実行し、次にメモリ使用量が増加し始めたときに 1 回実行し、最後にメモリ使用量に達したときに再度実行します。 JHat またはサードパーティ ツールを使用してダンプ ファイルを開きます。
3.jstack または JCONSOLE
デフォルトでは、プロセス コール スタック情報を表示して、IO タイムアウト、デッドロック、またはその他の状況を分析できます。プログラムに異常が発生した場合に分析する必要がある情報は、問題の特定とトラブルシューティングに役立ちます。
jstat -gc pid gaptime GC 関連情報を表示します
jstat -compiler pid リアルタイムのコンパイル情報を表示します
4.kill -3
上記と同様、開発ツールを持たないサーバーに適していますインストールされており、コール スタック情報といくつかの GC 情報を出力できます
5.iftop ネットワーク ポートを表示します
は gdb をインストールする必要があります。通常は、特定の仮想マシン レベルのエラーが発生したときに C/C++ プログラムをチェックするために使用されます。
以上がJavaのプログラム実行機構とエラーの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。