少し知っている人なら誰でも、Java は始めるのは簡単ですが、習得するのが難しい言語であることを知っているはずです。この記事では、その操作について説明します。 Java プログラムの仕組みやプロセスについては、私が収集したものなので、少しレイアウトが汚いかもしれませんが、ご容赦ください。私もまた、他者を助けるという目的を常に堅持してきました。 apache php mysql
java には、Java 仮想マシンとガベージ コレクション メカニズムという 2 つのコア メカニズムがあります。現時点では、ここでの主な焦点は Java プログラムを実行する jvm です。
(1) ターミナルで Java プログラムを実行する方法 (私はこれを Mac で実行しました。原理は Windows でも同じで、ほぼ同じです)
これを行うには、jdk がインストールされている必要があり、いいえ問題。
まず、Java クラスを実行したい場合は、まず Java クラスを用意する必要があります
1. java という名前のフォルダーを作成し、そのフォルダーの下に .java で終わるファイルを作成します (私はこれを sublime で編集しました)他のエディターでも動作します。例として HelloWorld を示します
2. コマンドを使用してファイルをコンパイルします
192:libexec huayu$ javac /Users/huayu/Desktop/java/HelloWord.java
コマンドを実行すると、java フォルダーに .class で終わる追加のファイルが見つかります
3. コンパイルされたクラス ファイルを実行します (クラス ファイルの場所でコマンドを実行する必要があることに注意してください。そうしないと、クラスが見つからないというエラーが報告されます)。ターミナルに次の出力が表示されます。
192:java huayu$ java HelloWord HelloWord
(2) jvm
の動作原理。上記の例 この目的は、ターミナルで Java プログラムを実行する方法を学習させることではなく、上記のプロセスでどのような操作が実行されるかを皆に知らせることです。 javac プログラムは Java コンパイラです。ファイル HelloWorld.java を HelloWorld.class ファイルにコンパイルし、それを Java 仮想マシンに送信します。仮想マシンは、コンパイラによってクラス ファイルに配置されたバイトコードを実行します。 (1) JVM によるクラス ファイルのロードの原理メカニズム JVM でのクラスのロードは、クラス ローダー (ClassLoader) とそのサブクラスによって実装されます。Java のクラス ローダーは、重要な Java A ランタイム システム コンポーネントです。これは、実行時にクラス ファイル内のクラスを検索してロードする役割を果たします。 Java のクロスプラットフォームの性質により、コンパイルされた Java ソース プログラムは実行可能プログラムではなく、1 つ以上のクラス ファイルになります。 Java プログラムがクラスを使用する必要がある場合、JVM はクラスがロード、接続 (検証、準備、解析) され、初期化されていることを確認します。
拡張機能: java.ext.dirs システムプロパティから指定されます。クラス ライブラリはディレクトリにロードされ、その親ローダーは Bootstrap です。
仮想マシンは、バイトコードを機械命令として使用する 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パラメータ:
-Xmn — ヒープ内の若い世代のサイズ
-XX:InitialTenuringThreshold / -XX :MaxTenuringThreshold: 旧世代のしきい値の初期値と最大値を設定します
コンピューターの高級言語タイプには、主にコンパイル型とインタープリター型が含まれます:
コンパイル言語: プログラムが実行される前に、別のコンパイル プロセスがあります。プログラムを機械語に翻訳すると、将来プログラムを実行するときに再度翻訳する必要がなくなります。
インタプリタ言語: 実行時にプログラムを機械語に翻訳するため、コンパイル言語よりも実行速度が遅くなります。
両者の最大の違いは、ターゲットの機械語コードが保存されるかどうかです。コンパイルは、入力されたソースプログラムを特定の単位(基本ブロック/関数/メソッド/トレースなど)でターゲットの機械語コードに変換して保存します。 (ディスク上かメモリ上かに関係なく、その後の実行に再利用できます。解釈とは、ソース プログラム内の命令を 1 つずつ解釈して実行し、解釈しながら実行することです。ターゲット コードは保存されず、以降の実行で再利用できる情報はありません。
Java の実行プロセスを理解します。Java ソース ファイル (*.java) は Java コンパイラー (javac) によってコンパイルされ、ByteCode バイトコード ファイル (*.class) が生成されます。バイトコードは、Java 自体によって設計されたコンピューターによって設計されます。 Java 仮想マシン (JVM) は解釈して実行します。仮想マシンは実行する各バイトコードをインタープリターに送信し、インタープリターはそれを特定のマシン上のターゲット マシン コードに変換して、特定のマシン上で実行します。
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:
この記事はここで終わります。不備がある場合は、ご指摘いただき、ご連絡ください。
関連記事:
関連動画:
メソッドの呼び出し void型メソッドの定義と呼び出し- JAVA基本紹介ビデオチュートリアル
以上がターミナルで Java プログラムを実行するにはどうすればよいですか?その動作メカニズムと動作原理を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。