Javaコアテクノロジーインタビューエッセンシャル(講義1)| Javaプラットフォームについてのあなたの理解について教えてください。

Java開発への露出から現在まで、Javaの最も直感的な印象は何ですか?それはそれが促進する「一度書けばどこでも実行できる」のか、それとも形式的すぎる文法なのか?Javaプラットフォームについて正確に何を知っていますか?立ち止まって、まず考えてみてください。

今日お聞きしたいのは、Javaプラットフォームについてのあなたの理解について話してください。「Javaは解釈と実行です」、この文は正しいですか?


典型的な答え

Java自体はオブジェクト指向言語です。最も重要な機能には2つの側面があります。1つはいわゆる「1回書き込み、どこでも実行」(1回書き込み、どこでも実行)で、クロスプラットフォーム機能を簡単に取得できます。ガベージコレクション(GC、ガベージコレクション)、Javaは、ガベージコレクター(ガベージコレクター)を介してメモリをリサイクルおよび割り当てます。ほとんどの場合、プログラマーはメモリの割り当てと回復について心配する必要はありません。

私たちは毎日JRE(Javaランタイム環境)またはJDK(Java Development Kit)にさらされています。Javaランタイム環境であるJREには、JVMとJavaクラスライブラリ、およびいくつかのモジュールが含まれています。JDKはJREのスーパーセットと見なすことができ、コンパイラやさまざまな診断ツールなど、より多くのツールを提供します。

「Javaは解釈と実行です」というフレーズの場合、このステートメントはあまり正確ではありません。私たちが開発したJavaソースコードは、最初にJavacによってバイトコードにコンパイルされ、次に実行時に、Java仮想マシン(JVM)に組み込まれたインタープリターによってバイトコードが最終的なマシンコードに変換されます。ただし、ほとんどの場合に使用するOracle JDKによって提供されるホットスポットJVMなどの一般的なJVMは、一般に動的コンパイラと呼ばれるJIT(Just-In-Time)コンパイラを提供します。JITは実行時にホットスポットを変換できます。コードはマシンコードにコンパイルされます。この場合、ホットコードの一部は、解釈および実行されるのではなく、コンパイルおよび実行されます。

知識の拡大

トピックに戻ると、次のような多くの側面からJavaプラットフォームの理解について簡単に説明できます。ジェネリック、Lambda、その他の言語機能を含むJava言語機能、コレクション、IO / NIO、ネットワーク、同時実行性を含む基本クラスライブラリ、およびセキュリティおよびその他の基本ライブラリ。日常業務で多く使用しているクラスライブラリについては、面接前に体系的にまとめることができるので、その場で遊ぶことができます。

または、JavaのクラスロードメカニズムなどのJVMの基本的な概念とメカニズム、およびBootstrap、Application、Extension Class-loaderなどの一般的に使用されるバージョンのJDK(JDK 8など)に組み込まれているClass-Loaderについて説明します。クラスのロードのプロセス:ロード、検証、リンク、初期化(Zhou Zhimingの「Java仮想マシンの詳細な理解」、優れたJVM入門書を参照)、カスタムクラスローダーなど。ガベージコレクションの基本原則もあります.SerialGC、Parallel GC、CMS、G1などの最も一般的なガベージコレクターは、どのワークロードが最適であるかをよく理解しています。これらはすべて拡張可能な領域であり、後のコラムでより体系的に紹介します。

もちろん、JDKに含まれているツールや、コンパイラ、ランタイム環境、セキュリティツール、診断および監視ツールなど、Java分野の他のツールもあります。これらの基本的なツールは、日常の作業効率を保証するものであり、他の言語プラットフォームでの作業にも役立ちます。それらの多くは類似しています。

下の写真は、参考のために要約した比較的幅広い青写真です。

これ以上の拡張は必要ありません。以前に尋ねた解釈、実行、コンパイル、および実行の質問に戻ります。一部のインタビュアーは、インタビュアーの知識についてさらに学ぶための効果的な方法であるため、特定の質問について「収益を確認する」ことを好みます。これについては、もう少し詳しく説明します。

ご存知のとおり、通常、Javaはコンパイル時とランタイムに分けられます。ここで説明するJavaコンパイルとC / C ++の意味は異なります。Javacのコンパイル、つまりJavaソースコードをコンパイルして「.class」ファイルを生成する場合、実際にはバイトコードが含まれ、直接実行できるマシンコードは含まれません。Javaは、バイトコードとJava仮想マシン(JVM)のクロスプラットフォームの抽象化を通じて、オペレーティングシステムとハードウェアの詳細を保護します。これは、「一度コンパイルして、どこでも実行」を実現するための基礎でもあります。

実行時に、JVMはクラスローダーを介してバイトコードをロードし、それを解釈またはコンパイルして実行します。先に述べたように、JDK 8などの主流のJavaバージョンでは、実際には解釈とコンパイルの混合モード、いわゆる混合モード(-Xmixed)です。一般に、サーバーモードで実行されているJVMは、効率的なコンパイルに十分な情報を収集するために数万回の呼び出しを行います。クライアントモードのしきい値は1500です。Oracle Hotspot JVMには、2つの異なるJITコンパイラが組み込まれています。C1は前述のクライアントモードに対応し、通常のJavaデスクトップアプリケーションなど、起動速度に敏感なアプリケーションに適しています。C2は、最適化されたサーバーモードに対応します。長時間実行サーバー用エンドアプリケーション用に設計されています。デフォルトでは、いわゆる階層型コンパイル(TieredCompilation)が使用されます。ここでは、JITの詳細については詳しく説明しません。すぐに参加する必要はありません。階層化されたコンパイルの内容については、後で紹介します。

Java仮想マシンの起動時に、さまざまなパラメーターを指定して動作モードを選択できます。たとえば、「-Xint」を指定すると、コードをコンパイルせずに解釈と実行のみを実行するようにJVMに指示します。このモードは、JITがもたらす可能性のあるパフォーマンス上の利点を放棄します。結局のところ、インタプリタは1つずつ読み込み、1つずつ解釈して実行します。これに対応して、「-Xcomp」パラメーターもあります。これは、JVMにインタープリターを閉じて、インタープリターを実行しないように指示します。これは、最大最適化レベルと呼ばれます。次に、このモデルが最も効率的かどうかを尋ねることができますか?簡単に言えば、それは必ずしも真実ではありません。「-Xcomp」を使用すると、JVMの起動が非常に遅くなります。同時に、分岐予測などの一部のJITコンパイラ最適化方法は、プロファイリングなしでは効果的に最適化できないことがよくあります。

Javaの最も一般的な日常の使用に加えて、実際には、バイトコードをマシンコードに直接コンパイルしてJITのウォームアップなどを回避する、いわゆるAOT(Ahead-of-Time Compilation)という新しいコンパイル方法があります。 Oracle JDK 9などのオーバーヘッドのさまざまな側面で実験的なAOT機能が導入され、新しいjaotcツールが追加されました。次のコマンドを使用して、特定のクラスまたは特定のモジュールをAOTライブラリにコンパイルします。


jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base

 次に、起動時に直接指定します。


java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld

さらに、Oracle JDKは階層コンパイルとAOTの共同使用をサポートしており、この2つは代替関係ではありません。興味がある場合は、関連ドキュメントを参照できます:http://openjdk.java.net/jeps/295。AOTはこの方法だけでなく、業界には関連機能を提供するためのサードパーティツール(GCJ、Excelsior JETなど)が長い間ありました。

さらに、強力なプラットフォームとして、JVMはJVM上で実行できるJava言語であるだけでなく、基本的にすべての準拠バイトコードを実行できます。Java言語自体もこれに便利です。ClojureやScalaなどを見ることができます。 .Groovy、JRuby、Jythonなどの多数のJVM言語がさまざまなシナリオでアクティブになっています。

本日は、Javaプラットフォームに関連するコンテンツを簡単に紹介しました。目的は、Java言語機能、コアクラスライブラリと一般的に使用されるサードパーティクラスライブラリ、Java仮想マシンの基本原則、および関連ツール。あなたは役に立ちます。


他の古典的な答え

以下は、ネチズンWojからの回答です。

「一度コンパイルして、どこでも実行する」とは、Java言語のクロスプラットフォーム機能を指します。Javaのクロスプラットフォーム機能は、さまざまな環境で実行できるJava仮想マシンの存在と切り離せません。たとえば、WindowsプラットフォームとLinuxプラットフォームには対応するJDKがあり、JDKをインストールすると、Java言語の実行環境ができます。実際、Java言語自体は他のプログラミング言語とそれほど違いはありません。Java言語がクロスプラットフォームであるというわけではありませんが、Java言語が異なるプラットフォームで実行できる環境があります。そのためJavaには1つあります。 -時間のコンパイル、どこでも。そのような効果を実行します。

厳密に言えば、クロスプラットフォーム言語としてのJavaだけではありませんが、Javaはより成熟した言語です。「一度コンパイルして、どこでも実行する」の効果は、コンパイラーに関連しています。プログラミング言語の処理には、コンパイラーとインタープリターが必要です。Java仮想マシンはDOSに似ており、プログラムを実行するためのプラットフォームに相当します。

プログラムには、ソースコードから実行までの3つの段階があります:コーディング-コンパイル-実行-デバッグ。Javaは、コンパイル段階でクロスプラットフォームの特性を具体化します。コンパイルプロセスはおおまかに次のようになります。1つ目は、Javaソースコードを.CLASSファイルのバイトコードに変換することです。これが最初のコンパイルです。.classファイルは、どこでも実行できるファイルです。次に、Javaバイトコードがターゲットマシンコードに変換されます。これは、Javaの2番目のコンパイルであるJVMによって実行されます。

 「どこでも実行」の鍵と前提はJVMです。JVMは2番目のコンパイルで重要な役割を果たすためです。JVMオペレーティングシステムは、Java仮想マシンを実行できる場所ならどこにでも含まれています。その結果、JAVAはさまざまなプラットフォームでさまざまな仮想メカニズムを提供し、「どこでも実行」の効果を実現します。Javaはコンパイルメカニズムではなく、解釈メカニズムであることを強調しておく必要があります。Javaバイトコードの設計では、JITを十分に考慮しています。これは、バイトコードを仮想マシンのコンポーネントでもある高性能のネイティブマシンコードに直接変換できるジャストインタイムコンパイルメソッドです。

ネチズンの3つの軍隊からの次の答え:

Javaの機能:

オブジェクト指向(カプセル化、継承、ポリモーフィズム)、プラットフォームの独立性(.classファイルを実行するJVM)、言語(汎用、Lambda)、クラスライブラリ(コレクション、同時実行、ネットワーク、IO / NIO)、JRE(Javaランタイム環境、JVM、クラスライブラリ)、JDK(JRE、javac、診断ツールを含むJava開発ツール)

Javaは解析して実行しますか?

不正解です!

1. JavaソースコードはJavacによって.classファイルにコンパイルされます。2。.classファイルはJVMによって解析またはコンパイルされ、実行されます(1)解析済み:.classファイルはJVM組み込みパーサーによって解析および実行されます。(2)コンパイル:頻繁に実行されるコードを「ホットコード」として使用して、ローカルプラットフォームに関連するマシンコードをコンパイルし、さまざまなレベルの最適化を実行するJITコンパイラ(Just In Time Compile)があります。(3)AOTコンパイラ:Java 9は、実行のためにすべてのコードをマシンコードに直接コンパイルします。

以下は、ネチズンのジェリー・インインからの回答です。

長い間注意を払った後、ようやく最初の講義を楽しみにしていました。このトピックを見たとき、私はすぐにクリックして元のテキストを読むのではなく、考える時間を与えました。

まず、個人的には、この質問は非常に抽象的で一般的だと感じています。この質問に対する標準的な回答はありませんが、「良い」回答はあります。回答の質は、インタビュアー自身の技術的リテラシーと体系的な理解に完全に依存します。 Javaの。私の理解は次のとおりです。

巨視的ビュー:c / c ++との最大の違いは、c / c ++プログラミングはオペレーティングシステム指向であり、開発者は異なるオペレーティングシステム間の違いに細心の注意を払う必要があることです。一方、Javaプラットフォームはオペレーティングシステムの最下層を仮想マシンの詳細。これにより、開発者は異なるオペレーティングシステム間の違いについてあまり気にする必要がなくなります。間接的な中間層を追加することによる「デカップリング」は、コンピューター分野で非常に一般的な「芸術的手法」です。これは、仮想マシン、オペレーティングシステム、およびHTTPに当てはまります。Javaプラットフォームは、多くの研究分野とアプリケーション分野が存在するエコシステムを形成しています。

1.仮想マシンとコンパイルテクノロジーの研究(例:GC最適化、JIT、AOTなど):効率の追求は人間のもう1つの性質です

2.Java言語自体の最適化

3.ビッグデータ処理

4.Java並行プログラミング

5.クライアント開発(例:Androidプラットフォーム)

6......。

微視的ビュー:Javaプラットフォームには2つのコアがあります。1。Java言語自体、JDKで提供されるコアクラスライブラリおよび関連ツール2.Java仮想マシンおよびその他の含まれるGC

1. Java言語自体、JDKで提供されるコアクラスライブラリおよび関連ツール

Javaプラットフォームの開発に携わるには、Java言語、コアクラスライブラリ、および関連ツールを習得する必要があります。これが基盤の基盤だと思います。

>>言語自体を理解するには、開発者は言語の文法構造に精通している必要があります。Javaはオブジェクト指向言語であるため、開発者はオブジェクト指向設計の概念を深く理解する必要があります。

>> Javaコアクラスライブラリには、コレクションクラス、スレッド関連クラス、IO、NIO、およびJUC並行パッケージなどが含まれます。

>> JDKが提供するツールには、基本的なコンパイルツール、仮想マシンのパフォーマンステスト関連ツールなどがあります。

2.Java仮想マシン

Java言語にはクロスプラットフォームの特徴がありますが、それはまさに仮想マシンの存在によるものです。Javaソースファイルはバイトコードにコンパイルされ、仮想マシンによってロードされて実行されます。ここには、暗黙の意味の2つのレベルがあります。

1)ほとんどの場合、プログラマーは、基礎となる詳細を気にすることなく、Java言語自体を気にするだけで済みます。メモリの割り当てと回復を含め、GCにも完全に引き渡されます。

2)仮想マシンの場合、仕様を満たすバイトコードであれば、ロードして実行できます。もちろん、正常に実行できるプログラムでは、この点を満たすだけでは不十分です。プログラム自体は、次のことを確認する必要があります。運転中に異常が発生しないこと。したがって、Scala、Kotlin、Jythonなどの言語も仮想マシンで実行できます。

仮想マシンの効率に焦点を当てると、JITやAOTなどのいくつかの最適化手法が含まれます。仮想マシンがバイトコードをロードすると、完全に解釈されて実行されるため、必然的に実行効率に影響します。したがって、この操作リンクの場合、仮想マシンは、頻繁に実行される特定のコードをマシンコードにコンパイルするJITテクノロジなどの最適化処理を実行します。AOTテクノロジーは、実行前にツールを介してバイトコードをマシンコードに直接変換します。

次の答えは、ネチズンのOuyangTianからのものです。

1. JVMメモリモデル、ヒープ、スタック、メソッド領域、クロスプラットフォームバイトコード、JVM内の強参照、弱参照、ソフト参照、およびファントム参照。finalizeメソッドを使用して保存できますか?;親はクラスの読み込みを委任されますが、親とは何ですか?親は複数の親です。ドキュメントをロードしてからロードします。このドキュメントはJVMで同じですか?;ポリモーフィズムはJavaが必要とするコアコンセプトであり、オブジェクト指向の動作の最良の解釈でもあります。メソッドのオーバーロードとメモリ内での書き換えの実行フロー、およびこの特定のメソッドを見つける方法を理解します。

2.開発プロセス、JDK5(書き換えバグ)、JDK6(最も安定した商用バージョン)、JDK7(スイッチ文字列のサポート)、JDK8(関数型プログラミング)が進化しています。

3.祖先クラスObjectと、その動作が実際の生活とどのように関連しているかを理解します。

4. TaoとShuの組み合わせであるため、23のデザインパターンを理解します。

次の答えは、ネチズンのストーンライオンから来ています。

1.一度コンパイルして、どこでも実行します。jvmレイヤーはシステムAPIをカプセル化し、さまざまなシステムに一貫した呼び出し動作を提供します。さまざまなオペレーティングシステムやさまざまなアーキテクチャに適応するための作業負荷を軽減します。

2.ガベージコレクションは、開発中のメモリ収集の難しさを軽減します。メモリリークの可能性を減らします。それはまたいくつかの追加費用をもたらしますが、それは利益を補うのに十分です。合理的な生成戦略により、メモリ使用量が向上します。

3.他のコンパイル言語と比較して、jitはコンパイル時間を短縮します。これは、ほとんどのコードが実行時にコンパイルされるため、コンパイル時にコンパイルに参加するコールドコードの問題が回避されるためです。

 コード実行の効率を改善しました。Luaは以前のプロジェクトで関連する開発に使用されていました。luaはインタプリタ言語であり、lua-jitと組み合わせて使用​​されるためです。開発プロセス中に、記述されたluaコードがjitでサポートされていない場合、コードのパフォーマンスはコンパイル可能なコードと比較して非常に低くなります。

 

 

おすすめ

転載: blog.csdn.net/qq_39331713/article/details/114009721