2020年の最新のJavaコレクションの一般的なインタビューの質問+詳細な回答(17)
Java関連の資料を更新し続けます。最近、私は大ボスの最新のインタビューニュースを調べて、より包括的なインタビュー情報を収集しようと数日を費やしました。最初のいくつかのコレクションを見たい場合は、私のホームページにアクセスしてそれらを見つけることができます。これがアップデートの最後のコレクションです。さらに必要な場合は、記事の最後を読んで一緒に学ぶことができます。
答えのいくつかは私自身によって要約され、いくつかはインターネット上で収集されます。これらのインタビューを見た後、慌てないでください!経験が豊富な方はコメント欄で共有していただけます。間違いがございましたら、ご指摘ください。お気軽にご相談ください。ありがとうございます。
JVM
194.jvmの主要コンポーネントについて教えてください。そしてその役割は?
-
ClassLoader(ClassLoader)
-
ランタイムデータエリア
-
実行エンジン
-
ネイティブインターフェース
コンポーネントの役割:最初に、JavaコードがClassLoaderを介してバイトコードに変換され、次にバイトコードがランタイムデータエリアのメモリにロードされます。バイトコードファイルはJVMの一部にすぎません。命令セット仕様のセットは、実行のために基盤となるオペレーティングシステムに直接渡すことはできません。したがって、バイトコードを基盤となるシステム命令に変換し、CPUに渡して実行するために、特定のコマンドパーサー実行エンジン(実行エンジン)が必要です。プログラム全体の機能を実現するには、他の言語のネイティブインターフェイス(ネイティブインターフェイス)を呼び出す必要があります。
195.jvmランタイムデータ領域について教えてください。
-
プログラムカウンター
-
仮想マシンスタック
-
ネイティブメソッドスタック
-
ヒープ
-
メソッドエリア
仮想マシンプロセスの開始時に存在する領域もあれば、ユーザープロセスの開始と終了に応じて作成および破棄される領域もあります。
196.スタックの違いについて教えてください。
1.スタックメモリはローカル変数を格納し、ヒープメモリはエンティティを格納します。
2.ローカル変数のライフサイクルが非常に短いため、スタックメモリの更新速度はヒープメモリよりも高速です。
3.スタックメモリに保存されている変数は、ライフサイクルが終了すると解放され、ヒープメモリに保存されているエンティティは、ガベージコレクションメカニズムによって随時リサイクルされます。
197.キューとスタックとは何ですか?違いは何ですか?
-
キューとスタックの両方がデータの事前保存に使用されます。
-
キューでは、ファーストインファーストアウトで要素を取得できますが、例外があります。Dequeインターフェイスでは、要素を両端から取得できます。
-
スタックはキューと非常に似ていますが、要素のラストイン、ファーストアウト検索を実行します。
198.親の委任モデルとは何ですか?
親委任モデルを紹介する前に、クラスローダーについて説明しましょう。どのクラスでも、JVMの一意性は、JVMをロードするクラスローダーとクラス自体によって確立される必要があります。各クラスローダーには、独立したクラス名スペースがあります。クラスローダーは、指定された完全修飾名に従ってクラスファイルをJVMメモリにロードし、それをクラスオブジェクトに変換します。
クラスローダーの分類:
-
仮想マシン自体の一部であるBootstrapClassLoaderは、Java_HOME / lib /ディレクトリ、または-Xbootclasspathパラメータで指定され、仮想マシンによって認識されるパスにクラスライブラリをロードするために使用されます。
-
その他のクラスローダー:
-
拡張ClassLoader:ロードを担当<java_home style = "box-sizing:border-box; -webkit-tap-highlight-color:transparent; text-size-adjust:none; -webkit-font-smoothing: antialiased; Outline:0px!important; "> \ lib \ extディレクトリまたはJavaで指定されたパス内のすべてのクラスライブラリ。ext。dirsシステム変数; </ java_home>
-
アプリケーションClassLoader(アプリケーションClassLoader)。指定されたクラスライブラリをユーザークラスパスにロードする責任があり、このクラスローダーを直接使用できます。一般に、カスタムクラスローダーがない場合、このローダーがデフォルトで使用されます。
親委任モデル:クラスローダーがクラスロード要求を受信した場合、最初にクラスをロードするのではなく、要求を親クラスローダーに委任して完了させます。これは、クラスローダーの各レイヤーの場合です。 、すべてのロード要求が最上位のスタートアップクラスローダーに送信されるようにします。親ロードがロード要求を完了できない場合(必要なクラスが検索範囲に見つからない場合)にのみ、子ローダーはクラスのロードを試みます。 。
199.クラスローディングの実行プロセスについて教えてください。
クラスの読み込みは、次の5つのステップに分かれています。
-
ロード:検索パスに従って対応するクラスファイルを検索し、インポートします。
-
チェック:ロードされたクラスファイルの正確さをチェックします。
-
準備:クラス内の静的変数にメモリスペースを割り当てます。
-
解決策:仮想マシンが定数プール内のシンボル参照を直接参照に置き換えるプロセス。シンボリックリファレンスはマークとして理解され、直接リファレンスはメモリ内のアドレスを直接指します。
-
初期化:静的変数と静的コードブロックの初期化を実行します。
質問のセルフチェックを見てから詳細な回答を見ると、より効果的です。
200.オブジェクトをリサイクルできるかどうかを判断するにはどうすればよいですか?
判断する方法は一般に2つあります。
-
参照カウンター:オブジェクトごとに参照カウントを作成します。オブジェクト参照がある場合、カウンターは+1になり、参照が解放されると-1にカウントされ、カウンターが0の場合に再利用できます。循環参照の問題を解決できないという欠点があります。
-
到達可能性分析:GCルートから開始して下方向に検索すると、検索によってたどるパスは参照チェーンと呼ばれます。オブジェクトが参照チェーンによってGCルートに接続されていない場合、オブジェクトをリサイクルできることが証明されます。
201. javaにはどのような参照タイプがありますか?
-
強い引用
-
ソフトリファレンス
-
弱い参照
-
ファントムリファレンス(ファントムリファレンス/ファントムリファレンス)
202.jvmにはどのようなガベージコレクションアルゴリズムがあるのか教えてください。
-
マーククリアアルゴリズム
-
マークアップアルゴリズム
-
コピーアルゴリズム
-
世代別アルゴリズム
203. jvmにはどのようなガベージコレクターがありますか?
-
シリアル:最も初期のシングルスレッドシリアルガベージコレクター。
-
Serial Old:古いバージョンのSerialガベージコレクター。これもシングルスレッドであり、CMSガベージコレクターの代わりに使用できます。
-
ParNew:シリアルのマルチスレッドバージョンです。
-
ParallelコレクターとParNewコレクターは同様にマルチスレッドですが、Parallelはスループット優先のコレクターであり、システムスループットと引き換えに待機時間を犠牲にすることができます。
-
Parallel Oldは、Parallelの旧世代バージョンであり、Parallelはコピーされたメモリ再利用アルゴリズムを使用し、ParallelOldはマーク定義メモリ再利用アルゴリズムを使用します。
-
CMS:B / Sシステムに非常に適した、最短の休止時間を取得することを目的としたコレクター。
-
G1:スループットと一時停止時間を考慮したGC実装。これは、JDK9以降のデフォルトのGCオプションです。
204.CMSガベージコレクターについて詳しく教えてください。
CMSは、英語でのConcurrent Mark-Sweepの略で、スループットを犠牲にして最短の回復一時停止時間を取得するガベージコレクターです。サーバーの応答速度が必要なアプリケーションには、このガベージコレクターが非常に適しています。JVMを起動するパラメータに「-XX:+ UseConcMarkSweepGC」を追加して、CMSガベージコレクタの使用を指定します。
CMSはマークスイープアルゴリズムを使用するため、gc中に大量のメモリフラグメンテーションが生成されます。残りのメモリがプログラム操作の要件を満たせない場合、システムは同時モード障害として表示され、一時CMSはシリアルオールドコレクターを使用します。ゴミ除去を実行します。このとき、パフォーマンスが低下します。
205.新世代のガベージコレクターと旧世代のガベージコレクターとは何ですか?違いは何ですか?
-
新世代コレクター:Serial、ParNew、Parallel Scavenge
-
オールドエイジコレクター:シリアルオールド、パラレルオールド、CMS
-
ヒープコレクター全体:G1
新世代のガベージコレクターは通常、コピーアルゴリズムを使用します。コピーアルゴリズムの利点は高効率ですが、デメリットはメモリ使用率が低いことです。旧世代のコレクターは通常、ガベージコレクションにマークソートアルゴリズムを使用します。
206.世代別ガベージコレクターがどのように機能するかを簡単に説明してください。
世代別コレクターには、旧世代と若年世代の2つのパーティションがあります。新世代のデフォルトスペースは合計スペースの1/3を占め、旧世代のデフォルト比率は2/3です。
新世代はレプリケーションアルゴリズムを使用します。新世代には、Eden、To Survivor、From Survivorの3つのパーティションがあります。デフォルトの比率は8:1:1です。実行プロセスは次のとおりです。
-
Eden + FromSurvivorの生き残ったオブジェクトをToSurvivorエリアに配置します。
-
EdenとFromSurvivorのパーティションをクリアします。
-
FromSurvivorとToSurvivorのパーティションスワップ、FromSurvivorはToSurvivorになり、ToSurvivorはFromSurvivorになります。
FromSurvivorからToSurvivorに移動するたびに存続するオブジェクトは、年齢が+1になり、15(デフォルト構成は15)に達すると、古い世代にアップグレードされます。大きなオブジェクトも直接古い世代に入ります。
旧世代が占めるスペースが一定の値に達すると、グローバルガベージコレクションがトリガーされます。通常、タグ付けの実行アルゴリズムが使用されます。上記のサイクルは、世代別ガベージコレクション全体の全体的な実行プロセスを構成します。
207.jvmチューニングツールについて教えてください。
JDKには、JDKのbinディレクトリにある多くの監視ツールが付属しています。その中で最も一般的に使用される2つのビュー監視ツールは、jconsoleとjvisualvmです。
-
jconsole:JVMのメモリ、スレッド、およびクラスを監視するために使用されます。
-
jvisualvm:JDKに付属するオールラウンドな分析ツールで、メモリスナップショット、スレッドスナップショット、プログラムデッドロック、メモリ変更の監視、gc変更などを分析できます。
208.一般的に使用されるjvmチューニングパラメータは何ですか?
-
-Xms2g:初期プッシュサイズは2gです。
-
-Xmx2g:最大ヒープメモリは2gです。
-
-XX:NewRatio = 4:若い世代と古い世代のメモリ比を1:4に設定します。
-
-XX:SurvivorRatio = 8:新世代のエデンとサバイバーの比率を8:2に設定します。
-
-XX:+ UseParNewGC:ParNew + SerialOldガベージコレクターの組み合わせの使用を指定します。
-
-XX:+ UseParallelOldGC:ParNew + ParNewOldガベージコレクターの組み合わせの使用を指定します。
-
-XX:+ UseConcMarkSweepGC:CMS +シリアルオールドガベージコレクターの組み合わせを指定します。
-
-XX:+ PrintGC:gc情報の印刷をオンにします。
-
-XX:+ PrintGCDetails:gcの詳細情報を出力します。
やっと
Java Basic Questions Interview Collectionの内容はここで更新されます。さらに必要な場合は、下の[一緒に学ぶ]をクリックしてください。フォローアップにはもっと違う内容がありますので、皆様のお役に立てれば幸いです。
最後に、私はあなたに何かを言いたいと思います。私は長年働いて、他の人のために何人かの人々にインタビューしました。面接官またはリーダーの観点からであろうとなかろうと、面接のスキルと経験に加えて、優れた技術とプロジェクトの経験も彼らの切り札と自信です。一流メーカーのコアテクノロジー共有
教材を整理するのに時間がかかりました。上に投稿したのは、教材の氷山の一角です。お役に立てれば幸いです。一緒に秘密のコードを学ぶためにクリックしてください:csdn
フォローアップでより純粋な乾物の記事を共有し、本当にあなたを助けたいと思っています。あなたのサポートが私の最大の動機です!フォローしていいね!