Javaプログラムの運行メカニズムとエラー分析について説明します。


JVM(Java仮想マシン)は、デバイスの仕様を計算するために使用され、異なる方法(ソフトウェアまたはハードウェア)で実装される。仮想マシンをコンパイルする命令セットは、マイクロプロセッサをコンパイルする命令セットと非常に類似しています。Java仮想マシンは、バイトコード命令セット、レジスタセット、スタック、ゴミ回収セット、および記憶方法領域を含む。
       Java仮想マシン(JVM)はJavaコードを実行できる仮想コンピュータです。JVM規格の説明に従って、解釈器を特定のコンピュータに移植すれば、コンパイルされた任意のJavaコードがシステム上で動作することが保証されます。
1.なぜJava仮想マシンを使うのですか?
      Java言語の非常に重要な特徴はプラットフォームとの無関係性です。Java仮想マシンを使うことはこの特徴を実現するための鍵です。一般的な高級言語は、異なるプラットフォームで実行するためには、少なくとも異なる目的コードにコンパイルする必要があります。Java言語の仮想マシンを導入した後、Java言語は異なるプラットフォームで実行する時に再コンパイルする必要がありません。Java言語使用モードJava仮想マシンは、Java言語コンパイラがJava仮想マシン上で動作するターゲットコード(バイトコード)を生成するだけで、複数のプラットフォーム上で修正なしに実行できるように、特定のプラットフォームに関する情報を遮断している。Java仮想マシンはバイトコードを実行する時、バイトコードを具体的なプラットフォーム上のマシン命令と解釈して実行します。
Java実行メカニズム
Javaプログラムの実行は、作成、コンパイル、実行の三つのステップを経なければなりません。
編纂とは、Java開発環境においてプログラムコードの入力を行い、最終的にサフィックス名をJavaというJavaソースファイルを形成することです。
コンパイルとは、Javaコンパイラを使ってソースファイルを誤り訂正するプロセスを指し、コンパイルした後に、拡張子の名前を持つ.classのバイトコードファイルを生成し、C言語のように最終的に実行可能ファイルを生成する。
実行とは、Javaインタプリタを使って、バイトコードファイルをマシンコードに変換して実行し、結果を表示することです。
バイトコードファイルは、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はプラットフォームにまたがらないです。つまり、異なるOS上のJVMは違っています。Windowsプラットフォーム上のJVMはLinux上では使えません。逆も同じです。
JAVAプログラム運行エラー分析
一般的には、すでに運営に投入されている大型プロジェクトに問題が発生する可能性が最も高いのは以下の通りです。
1.異常CPU使用
1)CPUの使用率を確認し、目標プロセスの使用状況を確認し、各カーネルの使用状況を確認する。補助的な位置決めは単一スレッド問題またはスレッドプール問題であることができます。
2)プログラムが正常な時間の後、突然CPUが垂直に上昇すると、プログラム内のロックと関連がある場合があります。(もしロックが短いなら、cas+yieldを試してスピンロックを実現します。)
3)デッドロック、直接に呼び出しスタックを導き、問題解決を探します。
2.異常メモリ
1)メモリが漏れています。何も言いません。dumpスタックから問題を探しています。
2)頻繁なGCでも性能が不十分になります。プログラムにGCが頻繁に発生する場合、注意しなければなりません。新入生のサイズを調整しても解決できない場合は、大量に一時的なオブジェクトを作成するコードが必要です。
3.ある作業スレッドの予期せぬ終了
4.異常なIO
1)オープンファイル、IO操作占有、ディスク使用率を確認します。コマンドdf iostatなどが使えます。
2)プログラム占有モニター、ネットワーク使用率があるかどうかを確認し、コマンドnetstatなどを使用できます。
ツールを使って故障を分析します。
1.jmap
jmap pidデフォルトはJAVAプロセスのメモリ使用に関する情報を調べます。
jmap-histo pidメモリのアクティブなインスタンスの数を確認します。
jmap-dump:format=b、file=(ファイル名)pidはjavaプログラムメモリを完全にエクスポートします。完全分析は三つの流れに分けて、プログラム初期化が完了したらjmap-dump:format=b、file=a.binを実行してメモリ占有が上昇し始めた時に一回実行して、最後に上限に達したらもう一度実行して、JHatまたは第三者ツールでdumpファイルを開けます。
3.jstackまたはJCONSOSE
デフォルトでは、プロセス呼び出しスタック情報を確認して、IOタイムアウト、デッドロック、または他の状況を分析します。プログラムに異常が発生したら分析しなければならない情報は、問題の位置付けと排除を補助することができます。
jstat-gc pid gaptimeはGC関連情報を調べます。
jstat-compler pidはリアルタイムでコンパイルされた情報を表示します。
4.キルル-3
同様に、developツールがインストールされていないサーバに適用され、起動スタック情報と一部のGC情報を出力することができます。
5.iftopネットを見る
ネットワークの出入り量とターゲットサーバ間の流量を調べて、攻撃によるものかどうか確認してください。
 psptack仮想マシンスタック
gdbをインストールする必要があります。普通はc/c++プログラムを検査するために使われます。いくつかの仮想マシンのレベルが間違っている時に。
締め括りをつける
Javaプログラムの実行過程は、先にコンパイルしてから、二つのステップを説明しなければなりません。Javaプログラムの運行メカニズムとエラー分析について紹介します。興味のある方はこの駅の他のテーマを参照してください。ここでは皆様が当駅を応援してください。