ホームページ  >  記事  >  Java  >  ターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析する

ターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析する

php是最好的语言
php是最好的语言オリジナル
2018-08-01 15:30:464664ブラウズ

少し知っている人なら誰でも、Java は始めるのは簡単ですが、習得するのが難しい言語であることを知っているはずです。この記事では、その操作について説明します。 Java プログラムの仕組みやプロセスについては、私が収集したものなので、少しレイアウトが汚いかもしれませんが、ご容赦ください。私もまた、他者を助けるという目的を常に堅持してきました。 apache php mysql

java には、Java 仮想マシンとガベージ コレクション メカニズムという 2 つのコア メカニズムがあります。現時点では、ここでの主な焦点は Java プログラムを実行する jvm です。

(1) ターミナルで Java プログラムを実行する方法 (私はこれを Mac で実行しました。原理は Windows でも同じで、ほぼ同じです)

これを行うには、jdk がインストールされている必要があり、いいえ問題。

まず、Java クラスを実行したい場合は、まず Java クラスを用意する必要があります

1. java という名前のフォルダーを作成し、そのフォルダーの下に .java で終わるファイルを作成します (私はこれを sublime で編集しました)他のエディターでも動作します。例として HelloWorld を示します

ターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析する

2. コマンドを使用してファイルをコンパイルします

192:libexec huayu$ javac /Users/huayu/Desktop/java/HelloWord.java

コマンドを実行すると、java フォルダーに .class で終わる追加のファイルが見つかります

ターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析する

3. コンパイルされたクラス ファイルを実行します (クラス ファイルの場所でコマンドを実行する必要があることに注意してください。そうしないと、クラスが見つからないというエラーが報告されます)。ターミナルに次の出力が表示されます。

192:java huayu$ java HelloWord
HelloWord

さんへ、おめでとうございます!ターミナルで最初の Java プログラムをコンパイルして実行しました。

実は、上の例の文字が間違っていることは編集者も知っていますので、気づかないふりをして、私に文句を言わないでくださいね

(2) jvm

の動作原理。上記の例 この目的は、ターミナルで Java プログラムを実行する方法を学習させることではなく、上記のプロセスでどのような操作が実行されるかを皆に知らせることです。

javac プログラムは Java コンパイラです。ファイル HelloWorld.java を HelloWorld.class ファイルにコンパイルし、それを Java 仮想マシンに送信します。仮想マシンは、コンパイラによってクラス ファイルに配置されたバイトコードを実行します。

(1) JVM によるクラス ファイルのロードの原理メカニズム

ターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析する

JVM でのクラスのロードは、クラス ローダー (ClassLoader) とそのサブクラスによって実装されます。Java のクラス ローダーは、重要な Java A ランタイム システム コンポーネントです。これは、実行時にクラス ファイル内のクラスを検索してロードする役割を果たします。

Java のクロスプラットフォームの性質により、コンパイルされた Java ソース プログラムは実行可能プログラムではなく、1 つ以上のクラス ファイルになります。 Java プログラムがクラスを使用する必要がある場合、JVM はクラスがロード、接続 (検証、準備、解析) され、初期化されていることを確認します。

クラスのロードとは、クラスの .class ファイル内のデータをメモリに読み取ることを指します。通常、バイト配列が作成されて .class ファイルに読み込まれ、ロードされたクラスに対応する Class オブジェクトが生成されます。 。ロードが完了しても、Class オブジェクトは完了していないため、クラスはまだ使用できません。クラスがロードされると、接続フェーズに入ります。これには、検証、準備 (静的変数にメモリを割り当て、デフォルトの初期値を設定する)、解析 (シンボリック参照を直接参照に置き換える) という 3 つのステップが含まれます。最後に、JVM は以下を含むクラスを初期化します。1) クラスに直接の親クラスがあり、そのクラスが初期化されていない場合は、最初に親クラスを初期化します。2) クラスに初期化ステートメントがある場合は、これらの初期化ステートメントを実行します。順番通りに。

クラスのロードは、ルート ローダー (BootStrap)、拡張ローダー (Extension)、システム ローダー (System)、およびユーザー定義のクラス ローダー (java.lang. ClassLoader のサブクラス) を含むクラス ローダーによって完了します。 Java 2 (JDK 1.2) 以降、クラスロードプロセスにはファーザー委任メカニズム (PDM) が採用されています。 PDM は、Java プラットフォームのセキュリティをより適切に確保します。このメカニズムでは、JVM に付属するブートストラップがルート ローダーであり、他のローダーには親クラス ローダーが 1 つだけあります。クラスをロードするには、まず親クラス ローダーがロードする必要があり、親クラス ローダーが何もできない場合にのみ、その子クラス ローダーが単独でクラスをロードします。 JVM は、Java プログラムへのブートストラップへの参照を提供しません。

以下はいくつかのクラスローダーの説明です:

ブートストラップ: 通常はローカルコードで実装され、JVM 基本コアクラスライブラリ (rt.jar) のロードを担当します。

拡張機能: java.ext.dirs システムプロパティから指定されます。クラス ライブラリはディレクトリにロードされ、その親ローダーは Bootstrap です。

System: アプリケーション クラス ローダーとも呼ばれ、その親クラスは Extension です。最も広く使用されているクラスローダーです。これは、環境変数 classpath またはシステム プロパティ java.class.path で指定されたディレクトリからクラスを記録し、ユーザー定義ローダーのデフォルトの親ローダーです。

(2) Java はどのようにして「一度コンパイルすればどこでも実行できる」を実現するのでしょうか?

ターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析する

仮想マシンは、バイトコードを機械命令として使用する CPU として理解できます。

オペレーティング プラットフォームごとに異なる仮想マシンがあります。

Java 仮想マシンのメカニズムは、基礎となるオペレーティング プラットフォームの違いを保護し、「一度コンパイルすればどこでも実行できる」を実現します。

(3) ガベージコレクションメカニズム (GC)

GC とは何ですか? GC は、プログラマが問題を起こしやすい箇所です。 Java が提供する GC 関数は、オブジェクトがスコープを超えているかどうかを自動的に検出して、メモリを自動的に再利用する目的を達成できます。Java 言語には、割り当てられたメモリを解放するための明示的な操作方法がありません。 Java プログラマーは、ガベージ コレクターがメモリ管理を自動的に処理するため、メモリ管理について心配する必要はありません。ガベージ コレクションを要求するには、System.gc() または Runtime.getRuntime().gc() メソッドのいずれかを呼び出すことができますが、JVM は明示的なガベージ コレクション呼び出しをマスクできます。 ガベージ コレクションはメモリ リークを効果的に防止し、利用可能なメモリを効果的に使用できます。ガベージ コレクターは通常、別個の優先度の低いスレッドとして実行され、予期せぬ状況下で、メモリ ヒープ内の停止したオブジェクトや長期間使用されなかったオブジェクトをクリアしてリサイクルします。プログラマは、特定のオブジェクトをリアルタイムで呼び出すことができません。または、すべてのオブジェクトがガベージ コレクションを受けます (プログラマは収集時間を正確に制御できません。System.gc() または Runtime.getRuntime().gc() を呼び出すことは、ガベージ コレクションを収集するように GC に通知することと同じです。これは一時的なものであり、確実ではありませんいつ集めますか?)

Java の初期の頃、ガベージ コレクションは Java の最大のハイライトの 1 つでした。これは、メモリ リークを効果的に防ぐためにサーバー側のプログラミングが必要だったためです。しかし、時間が経つにつれて、Java のガベージ コレクション メカニズムは批判されるようになりました。 。モバイル スマート ターミナルのユーザーは通常、Android システムよりも iOS システムの方が優れたユーザー エクスペリエンスを持っていると感じています。その根深い理由の 1 つは、Android システムのガベージ コレクションの予測不可能さにあります。

補足: 世代コピー ガベージ コレクション、マーク付きガベージ コレクション、増分ガベージ コレクションなど、多くのガベージ コレクション メカニズムがあります。標準的な Java プロセスにはスタックとヒープの両方があります。スタックにはプリミティブなローカル変数が格納され、ヒープには作成されるオブジェクトが格納されます。ヒープ メモリの再利用と再利用のための Java プラットフォームの基本アルゴリズムはマーク アンド スイープと呼ばれますが、Java は「世代別ガベージ コレクション」を使用してこれを改良しました。このメソッドは、Java オブジェクトのライフサイクルに従って、ヒープ メモリをさまざまな領域に分割します。ガベージ コレクション プロセス中に、オブジェクトはさまざまな領域に移動されることがあります。

: これは、オブジェクトが最初に生成された領域です。そして、ほとんどのオブジェクトにとって、これはそれらがこれまでに存在した唯一の領域です。

- 生存者: エデンの園で生き残ったオブジェクトはここに移動されます。

- Tenured: これは、十分に古いオブジェクトが保存されている場所です。若い世代のコレクション (Minor-GC) プロセスはここには触れません。若い世代のコレクションがオブジェクトを生涯管理の庭に入れることができない場合、完全なコレクション (メジャー GC) がトリガーされます。これには、大きなオブジェクトに十分なスペースを確保するための圧縮も含まれる場合があります。

ガベージコレクションに関連するJVMパラメータ:

    -Xms / -Xmx — ヒープの初期サイズ/ヒープの最大サイズ
  • -Xmn — ヒープ内の若い世代のサイズ
  • -XX:-DisableExplicitGC — System.gc() に影響を与えないようにする


  • -XX:+PrintGCDetails — GC の詳細を出力する

  • -XX:+PrintGCDateStamps — GC 操作のタイムスタンプを出力します

  • -XX:NewSize / XX:MaxNewSize — 新しい世代のサイズ/新しい世代の最大サイズを設定します

  • -XX :NewRatio — はい 古い世代と新しい世代の比率を設定します

  • -XX:PrintTenuringDistribution — 各新しい世代の GC 後の生存者パラダイス内のオブジェクトの年齢分布を設定します

  • distribution
  • -XX:InitialTenuringThreshold / -XX :MaxTenuringThreshold: 旧世代のしきい値の初期値と最大値を設定します



  • 最大値
  • -XX: TargetSurvivorRatio: サバイバー領域の目標使用量を設定します
  • オフトピック、jvmの実行メカニズムについて話してから、javaはコンパイル言語ですか、それともインタプリタ言語ですか?
  • 色々な情報を調べてみると、Javaをjsと比較してインタプリタ言語だという人もいるし、コンパイル言語だという人もいます。
  • まず、これら 2 つの言語タイプの概要を見てみましょう:

コンピューターの高級言語タイプには、主にコンパイル型とインタープリター型が含まれます:

コンパイル言語: プログラムが実行される前に、別のコンパイル プロセスがあります。プログラムを機械語に翻訳すると、将来プログラムを実行するときに再度翻訳する必要がなくなります。

インタプリタ言語: 実行時にプログラムを機械語に翻訳するため、コンパイル言語よりも実行速度が遅くなります。

両者の最大の違いは、ターゲットの機械語コードが保存されるかどうかです。コンパイルは、入力されたソースプログラムを特定の単位(基本ブロック/関数/メソッド/トレースなど)でターゲットの機械語コードに変換して保存します。 (ディスク上かメモリ上かに関係なく、その後の実行に再利用できます。解釈とは、ソース プログラム内の命令を 1 つずつ解釈して実行し、解釈しながら実行することです。ターゲット コードは保存されず、以降の実行で再利用できる情報はありません。

Java の実行プロセスを理解します。Java ソース ファイル (*.java) は Java コンパイラー (javac) によってコンパイルされ、ByteCode バイトコード ファイル (*.class) が生成されます。バイトコードは、Java 自体によって設計されたコンピューターによって設計されます。 Java 仮想マシン (JVM) は解釈して実行します。仮想マシンは実行する各バイトコードをインタープリターに送信し、インタープリターはそれを特定のマシン上のターゲット マシン コードに変換して、特定のマシン上で実行します。

ターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析する

Javaの最初の処理はjavacコンパイルで、その対象ファイルは機械語ではなくByteCodeですが、将来的には3つの処理方法が存在する可能性があります(ここで、現時点ではこれら3つの処理方法の評価はありませんが、 JVM の知識について徹底的に議論した後、検証を行う必要があります):

1. 実行時、ByteCode は JVM によって 1 つずつインタープリターに送信され、インタープリターはそれをマシンコードに変換して実行します。 (多くの人がインタープリター言語について話しており、これが出発点です)

2. 実行時に、一部の ByteCode がジャストインタイム コンパイラー (JIT) によってターゲット マシン コードにコンパイルされ、実行されることがあります (メソッドを使用) JRockit や Maxine など、一部の JVM は純粋な JIT コンパイルを使用して実装され、内部にインタプリタを持たないため、保存され、2 回目の実行でマシン コードに変換する必要はありません。 VM。

3. RTSJ は、javac の後に AOT の二次コンパイルを実行して、静的なターゲット プラットフォーム コードを生成します。

上記の 3 つの方法は同時に使用される場合があります。少なくとも 1 と 2 は同時に使用され、3 はプログラマが手動で指定する必要があります。

この点に関して、私は Java をコンパイルと解釈の間のハイブリッド言語として受け入れることに積極的です。

end:

この記事はここで終わります。不備がある場合は、ご指摘いただき、ご連絡ください。

関連記事:

Javaのプログラム動作機構とエラーの分析

PHP動作機構の徹底解釈

関連動画:

メソッドの呼び出し void型メソッドの定義と呼び出し- JAVA基本紹介ビデオチュートリアル

以上がターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。