インタビューはJVMにこの記事を読むように頼むだけで十分です

1. JVMとは何ですか?

第二に、JVMメモリモデル

スレッド共有とスレッド排他レイヤーの2つの部分によると、スレッド共有はヒープに分割されます(新しいオブジェクトはヒープに配置され、オブジェクトはスタックメモリエスケープにも割り当てられます)、メソッド領域(メタスペースとも呼ばれます)クラスオブジェクトを格納し、クラスはメソッドと属性を含み、静的変数、定数を格納します)、スレッドはスレッド共有領域に排他的に分割され
ます

  • ヒープ:新しいオブジェクトのほとんどはヒープに格納され、
  • メソッド領域:静的定数、静的変数、クラスクラスオブジェクト、

スレッド専用領域

  • 仮想マシンスタック:スタック内にスタックフレームがあります(ローカル変数テーブル、オペランドスタック(ローカル変数は最初にスタックにプッシュされ、計算中にスタックがポップアップされ、計算後にスタックが完了します。通常、オペランドスタックは空であるため、計算にのみ使用)、ダイナミックリンク、リターンアドレス)、高度な先入れ先出し
  • ローカルメソッドスタック:仮想マシンスタックと同様ですが、仮想マシンスタックがjavaメソッドを提供し、ローカルメソッドスタックがネイティブメソッドを提供します(ローカルメソッド、プラットフォームに密接に関連しており、移植性が低い)
  • プログラムカウンター(PCレジスタ):現在のスレッドが実行したコードの行数を記録します。

ここに画像の説明を挿入

3、JVMで一般的に使用されるチューニングパラメーター

  • -Xmx:最大ヒープメモリ、デフォルト値はコンピュータメモリの4分の1、-Xmx2g
  • -Xms:最小ヒープメモリ、-Xms2g
  • -Xmn:新しい世代のサイズを設定します。デフォルトはヒープの3分の1です
  • -Xss:スレッドスタックのサイズ(深さ)、-Xss256k
  • 古い世代と新しい世代の比率を設定します
  • 面積EとS1およびS2の比率を設定する

4.ヒープメモリの最大値と最小値の設定が可能な限り大きいのはなぜですか。

fullgcリサイクルの数を減らします。ヒープメモリが最小値に達すると、fullgcが実行されます。設定が小さすぎると、fullgcが頻繁に発生します。最大値に達し、メモリが不足すると、容量が拡張されます。

5. JVMランタイムデータ領域のコンポーネントは何ですか?それぞれ?

6. GCコレクターとは何ですか?

MinorGC:

  • シリアル:シングルスレッドコレクター、シリアル、コピーアルゴリズム、シンプルで効率的
  • ParNew(PN、推奨):マルチスレッドコレクター、並列、レプリケーションアルゴリズム、CMSでよく使用されます
  • ParallelScavenge(PS、デフォルト):マルチスレッドコレクター、並列、レプリケーションアルゴリズム、スループットを重視

MajorGC:

  • SerialOld(SO):シングルスレッドコレクター、シリアル、タグソートアルゴリズム
  • ParallelOld(PO、デフォルト):マルチスレッドコレクター、並列、マークソートアルゴリズム
  • CMS(推奨):マルチスレッドコレクター、同時実行、マーク削除アルゴリズム。

FullGC:-G1:
マルチスレッドコレクター、並列、マークソートアルゴリズム

ここに画像の説明を挿入

7. GC Rootオブジェクトとして使用できるオブジェクトは何ですか?

1.ローカル変数
2.静的変数
3.ローカルメソッドスタック
4.静的定数static final

8.コレクターの種類、それぞれの長所と短所を知っていますか。CMSについて簡単に説明する

S:シングルスレッドコレクション、非シングルコアサービスSTWは比較的長い
PN:利点、マルチコア実行は高速(通常はCMSで使用)
PS:スループットに重点(ユーザースレッド実行時間/ユーザースレッド実行時間+ GC実行時間)

CMS:
初期マーク(STW):古い世代のgc rootに直接関連するオブジェクトをマークし、
コンカレントマークにマークアップします:コンカレントマークはgc rootの下でマークされ、最初の(コンカレントスレッドとユーザースレッド)よりも少し時間がかかります一緒に実行)
Relabel:世代を超えて参照されるオブジェクトですが、これらのオブジェクトは到達可能です。古い世代のswt、cardテーブルにもいくつかのオブジェクトが
同時にクリアされています。

9.フルGCとは何ですか?MinorGC?MaiorGC?STW?

フルGC:MinorGC + MaiorGC
MinorGC:新しい世代のリカバリの
GC MaiorGC:古い世代のリカバリのGC
STW; STOP THE WORLD、すべてのユーザースレッドを停止

10. JVMの完全なGCプロセス(ygcからfgcまで)は何ですか?

プロセス:古い世代にygc(コピーアルゴリズム)を15回実行すると、大きなオブジェクトが直接古い世代に入り
ます。異常なプロセス:
動的経過時間:s領域内のオブジェクトの50%を超える経過時間> S領域の平均値が、古い世代に入ります(旧世代では、fullgc)
スペース保証が発生します。マイナーGCが発生する前に、仮想マシンはまず、旧世代で利用可能な最大の連続スペースが新しい世代のすべてのオブジェクトの合計スペースより大きいかどうかを確認します。この条件がtrueの場合、マイナーGCが安全であることが保証されます。確立されていない場合、仮想マシンはHandlePromotionFailureの設定値が保証の失敗を許可するかどうかを確認します。許可されている場合、旧世代で使用可能な最大の連続スペースが旧世代に昇格したオブジェクトの平均サイズより大きいかどうかのチェックが続行されます。大きい場合は、マイナーGCを実行しようとしますが、今回はマイナーGCが危険ですが、小さい場合は、または、HandlePromotionFailure設定ではリスクが許容されないため、代わりにフルGCを実行する必要があります。

11. OOMの異常な場所に関連するインタビューの質問にメモリリークがあるかどうかを判断する方法

メモリリークの特性:gcでリサイクルできないため、メモリリークが発生します。
jstackを使用して、GC実行後の古い世代のオブジェクトがリサイクルされるかどうかを確認します(最初は200M、2回目は300M、3回目は300Mなど)メモリリークが発生している可能性があります。
サービスが利用できない場合、JStackはfgc実行時間がygcよりはるかに長いことを確認し、メモリリークが発生する可能性があります

12. OOMについてはどうですか?トラブルシューティングする方法?OOMの原因は何ですか?OOMはいつ登場しましたか?

外部委託されたプロジェクト:バックグラウンドでページングが書き込まれません(フロントエンドがページングを行います)データ量が特に多い場合、呼び出しインターフェイスはヒープメモリを直接バーストし、すべてのオブジェクトを直接リサイクルします。

メモリリークにより、最終的にメモリオーバーフロー
が発生しますメモリリークによるメモリリーク:リークされたオブジェクトはリサイクルされません。メモリオーバーフローオブジェクトは直接リサイクルされ
ます。サービスは利用できません。オブジェクトは作成されるとすぐにリサイクルされます。深さ、直接リサイクル

oraclejdkにはこのツールしかありませんopenjdkには付属していません

13. Javaにはどのような参照型がありますか?

強い参照:Object o = new Object(); GCは強く参照されるオブジェクトを収集しません。メソッドには例外があり、メソッドはスタックを終了し、すべてのローカル変数がリサイクルされるため、ローカル変数の強い参照がリサイクルされます。
ソフト参照:SoftReferenceオブジェクト、JVMヒープメモリがいっぱいになると、ソフト参照オブジェクトを再利用します。キャッシュとして使用される
弱参照:WearkReferenveは一般的に使用量が少なく、次のGCの前にのみ存在できます。GCの若い世代または古い世代のGCがリサイクルされるたびに
仮想参照:Object o = new Object(); O = null;このオブジェクトをリサイクルするようにgcに通知します

14.参照渡しと値渡しの違いは何ですか?

基本的なデータ型の値の受け渡し
参照型の参照の受け渡し

15.新しいString()仮想マシンは何をしましたか?

1.現在のオブジェクトクラスの検索に移動します
2. 現在のオブジェクトクラスが見つからない(ロードするのが初めてなので)、現在のオブジェクトクラスをロードします
3. 現在のオブジェクトのスペースを開きます
4.属性を初期化します(親クラスの属性も初期化されます)親クラスの前に)
5、コンストラクターを実行します

16.ポインター衝突とは何ですか?ポインタの衝突はいつ発生しますか?

  • ポインタの衝突:ヒープ内のポインタは次のメモリアドレスを指します。複数のスレッドが同時にオブジェクトを作成すると、ポインタの衝突が発生します
  • 解決策:casメソッドを呼び出して同期を達成し、コードレベルではなくCPUハードウェアレベルでロックします。ロックロックはコードレベルでロックされますが、内部的にはcasも使用します

17.オンスタック割り当てとは何ですか?

1.6.25以降、jdkはスタック割り当てを提供します。オブジェクトはスタックに割り当てることができます。ローカルで作成されたオブジェクトはローカル参照のみです。他のメソッドは使用されません。このオブジェクトをヒープに配置して共有する必要はありません。スタックフレームに、

18.メモリエスケープ分析とは何ですか?

このオブジェクトが使用されている他の場所があるかどうかを確認します。このオブジェクトはスタックフレームプライベートではなくヒープに配置されます。そうでない場合、このオブジェクトはメモリを大量に消費し、ヒープにのみ配置できます。
簡単に言うと、ローカルで作成された通常のオブジェクトはローカルでのみ使用されるため、通常はスタックフレームに格納されますが、オブジェクトが大きすぎるか、オブジェクトが他の場所で参照されているため、オブジェクトはヒープにエスケープされます

19.ヒープ以外の新しいオブジェクトはどこに保存できますか?

スタック上の割り当て。スタックフレーム内ではなく、スタック上に存在します

20.オブジェクトの3つのコンポーネント?

  • オブジェクトヘッダー:タイプポインター(メソッド領域を指すクラスオブジェクト)、ハッシュ値、世代の経過時間、保持されているロック、現在のスレッドID、配列の長さ(配列オブジェクトのみ)、同じクラスによって作成された異なるオブジェクトこれらは類似しており、最大の違いはインスタンスデータにあります
  • インスタンスデータ:オブジェクトの一部のプロパティを格納します
  • データの入力:Java仮想マシンでは、オブジェクトが8バイトの倍数である必要があります。たとえば、バイトタイプは4バイトであり、8バイトに入力されます。

21、オブジェクトを引用する2つのオプションは何ですか?

1.スタックまたはメソッド領域の参照はヒープ内のオブジェクトを直接参照します
2.スタックまたはメソッド領域は単なるハンドル参照であり、ヒープ内にハンドルプールもあります。ハンドル参照はハンドルプールを介してオブジェクトを参照します

22.ハンドルプールを使用する利点は何ですか?

ガベージコレクション中に、ハンドルプールの参照が変更されている限り、スタック内の参照を変更する必要はありません。
短所:効率が低い、2つの参照が必要

23.ハンドルプールはいつ使用されますか?

異なる仮想マシンは異なる方法でオブジェクトを参照します

24. jvmは、オブジェクトがリサイクルされるかどうか(オブジェクトがゴミかどうか)をどのように判断しますか?

参照カウント方法(JDK1.7):
1.現在参照され
ていないオブジェクト2.相互に参照していないオブジェクト
既存の問題:ヒープメモリオブジェクトが相互に参照しているときに再利用されない

到達可能性アルゴリズム(JDK1.8、ルート検索アルゴリズム、gcルート):
スタック、メソッド領域、およびローカルメソッドスタックから参照を検索して、ヒープ内のオブジェクトに到達可能か、到達不可能かがリサイクルされ、gcrootに到達可能かどうかを判断します便利なオブジェクトですが、その他はゴミオブジェクトです

25. jvmがfullgcを直接使用してヒープ全体をリサイクルしないのはなぜですか?

効率は高くありません。プログラムでは、ほとんどのオブジェクトが3秒未満で存続するため、世代があります。新しい世代(それらのほとんどは新しい世代にのみ存在し、新しい世代はEden領域、s0(から)面積、s1(から)面積)、古い世代。
つまり、インターフェイスは3秒以上呼び出されません。それ以外の場合は、インターフェイスを最適化する必要があります。

26.完了したgcプロセスとは何ですか?

Eden領域がいっぱいになり、オブジェクトはgcrootアルゴリズムに従って復元されます。復元されなかったオブジェクトの保存期間は増加します
。S0領域がs0領域でいっぱいになると、コピーアルゴリズムを使用して有用なものをs1領域にコピーし、S0、
S1のすべてのオブジェクトを直接削除します領域がいっぱいになると、S0領域にもコピーされ、S1領域内のすべてのオブジェクトが削除されます。オブジェクトが15回コピーされると、古い世代に入ります。
古い世代は一定の割合に達します。マーク圧縮アルゴリズムを使用して、到達可能なオブジェクトにマークを付けます。マークされていないものをすべて圧縮し、これを削除してからマーカーをリセットし、次のマーカー圧縮アルゴリズムまで待ちます。
マーク圧縮アルゴリズムの短所:速度が遅い、プロセス全体がstw(世界を停止する、高速エリアが長時間停止する)
マーク削除アルゴリズム:これもマーク可能なオブジェクトであり、短所は断片化が深刻であり、見逃しやすいことです。

27、GC 6アルゴリズム?

  • 世代別アルゴリズム:
  • コピーアルゴリズム:Sゾーンがいっぱいです。到達可能なオブジェクトを別のSゾーンにコピーし、現在のSゾーンのすべてのオブジェクトを削除します
  • マーク圧縮:マーキングは到達可能なオブジェクトであり、マークされていないすべての圧縮は1つのピースに圧縮され、このピースを削除してからマークをリセットし、次のマーク圧縮アルゴリズムまで待機します。欠点は、速度が遅く、プロセス全体がstwになることです。
  • マークの削除:1.初期マーク:古い世代のgcrootに直接関連付けられているオブジェクト(stw)をマークします
    。2.並行マーク:ユーザースレッドがgcで実行され、gcroot(non-stw)に関連付けられている他のオブジェクトをマークします
    。ラベル変更:新世代をスキャンし、古いマークオブジェクトは(STW)若い世代までで、一般的に先に若い世代GCを行ってあります、効率を向上させるのSTW時間を短縮再ラベル
    をクリア古い時代:4同時クリアマークされていないオブジェクト(非stw)、オブジェクトがクリアされたときに古い時代に入った場合、オブジェクトはデフォルトでは削除されません(カードテーブルレコードがあります)。
    短所:
    1.フローティングガベージを処理できません(マークされたオブジェクトは、同時クリア中に突然到達できなくなります)
    2.ユーザースレッドと同時に実行されるため、CPU使用率が高くなります。
    利点:同時実行できるため、速度が速くなります
  • 参照カウント:オブジェクトがリサイクルされるかどうかを判断するためのJDK1.7のアルゴリズム。参照されていないオブジェクトをリサイクルし、オブジェクトに参照カウンターを追加します。オブジェクトへの参照がある場合は、カウンター値が1ずつ増加します。参照が無効な場合、カウンターの値は1ずつ減り、カウンターが常に0のオブジェクトは使用できなくなります。
  • 到達可能性分析方法:オブジェクトがリサイクルされるかどうかを判断するJDK1.8のアルゴリズム、到達可能なオブジェクトにマークを付ける、到達できないオブジェクトをリサイクルする、2つのオブジェクトが相互に参照し、gc rootが到達できない場合、オブジェクトもリサイクルされ、参照カウントを解決する相互に参照するリサイクル不可のオブジェクトの欠点

28.同時並行性の違いは何ですか?

  • 同時実行性の鍵は、必ずしも同時にではなく複数のタスクを処理できることです。ユーザースレッドとガベージコレクションスレッドは、食事の途中で電話をかけたり、電話の後も食事を続けるなど、同時に実行されます。
  • 並列処理の鍵は、複数のタスクを同時に処理する能力です。同時に食べる、呼び出すなどの複数のガベージコレクションスレッド

29.なぜ生存地区があるのですか?

サバイバーがない場合、エデン地区でマイナーGCが実行されるたびに、残っているオブジェクトが古い世代に送信されます。古い世代はすぐにいっぱいになり、メジャーGCがトリガーされます(メジャーGCは通常マイナーGCを伴うため、フルGCをトリガーしていると見なすこともできます)。古い世代のメモリ領域は新しい世代のメモリ領域よりもはるかに大きく、フルGCの実行にはマイナーGCよりも時間がかかります。長い実行時間の欠点は何ですか?頻繁なフルGCによって消費される時間は非常に長く、大規模なプログラムの実行と応答速度に影響します。一部の接続では、タイムアウトが原因で接続エラーが発生することは言うまでもありません。
Survivorの重要な点は、古い世代に送信されるオブジェクトを減らし、それによってフルGCの発生を減らすことです。

30.フリーリストとは何ですか?スレッドバッファーとは

ヒープ内のメモリ割り当てが完全に規則的である場合、ポインタは次のメモリブロックの開始アドレスを指します。
ヒープ内のメモリ割り当てが規則的でない場合は、使用されていない領域を記録する空きリストがあります。
ヒープは、完全CAS機構の後、スレッドごとに定期的なスレッドバッファ、スレッドバッファに格納された不規則なオブジェクトを作成し、また、より大きなバッファスレッドのために競合する他のスレッドを使用して
不規則での定期的な使用GCリサイクルメカニズムを調べるアルゴリズム

31.老朽化するのはどのようなものか

1.大きなオブジェクト(若い世代では不十分)
2.長命のオブジェクト
3.スペースの保証:新世代のパーティションメモリを超えるには大きすぎる
4.動的経過時間:Sゾーンに対応する現在のオブジェクトがSゾーンの平均経過時間の半分を超えている古い、古いオブジェクトは古い時代に入れられる

32.どのG1コレクターですか?

G1コレクター:明確な世代はありません。ヒープ間隔を多くの領域に分割します(領域領域のデフォルトサイズは約1M〜32M、最大領域は2048ブロックです)、
一部はEden領域、一部はS0、S1(Sと呼ばれます)領域、1つの部分はOld領域の3つの部分であり、H領域は古い世代の一部でもあります。これは、大きなオブジェクト(0.5以上のレギンのマージ、小さなレギンのマージ、大きなオブジェクトのレギンの消費量の増加)の格納に使用され、その他は空白です。配布エリア

1.同様の若い世代のGCを実行すると、EおよびS領域に残ったオブジェクトが空白領域になり、S領域になります。元の領域は空白領域になります。レプリケーションアルゴリズムと同様の
世代間参照:領域領域は小さな断片が分割され、現在の領域
他の領域にrset関係を導入するかどうかを示します。領域間に参照関係があります

33.各地域の割合

旧世代:新生代= 2:1
エデンエリア:サバイバーエリア(S0):サバイバーエリア(S1)= 8:1:1

34. FullGCはいつ発生しますか?

スペースの保証:マイナーGCが発生する前に、仮想マシンはまず、古い世代で利用可能な最大の連続スペースが新しい世代のすべてのオブジェクトの合計スペースより大きいかどうかを確認します。この条件が満たされている場合、マイナーGCは安全であることを確認できます。確立されていない場合、仮想マシンはHandlePromotionFailureの設定値が保証の失敗を許可するかどうかを確認します。許可されている場合、旧世代で使用可能な最大の連続スペースが旧世代に昇格したオブジェクトの平均サイズより大きいかどうかのチェックが続行されます。大きい場合は、マイナーGCを実行しようとしますが、今回はマイナーGCが危険ですが、小さい場合は、または、HandlePromotionFailure設定ではリスクが許容されないため、代わりにフルGCを実行する必要があります。

1.旧世代のスペース不足
2.メソッド領域の不足
3. System.gc()のアクティブな呼び出し
4.スペース保証の失敗

30台のサーバーの100%CPUを見つける方法は?

1.
どのプログラムが高いCPU使用率を検出するか、トップ2.どのプログラムが現在のプログラムを検出するか、どのスレッド占有率が高いか
ps -mp pid -o THREAD、tid、time
ps -mp 5118 -o THREAD、tid、time
3 jstackは、スレッドと彼が実行しているメソッドに対応します
。jstack5118> a.txtスレッドのスナップショットを出力
ます。tidを16進数の5140-> 1414に変換し
、nid = 0x1414を見つけてメソッドを見つけます。

35.メモリオーバーフローを見つける方法は?

1.プログラムにラージオブジェクトがあります。ダンプオブジェクトでラージオブジェクトを表示できます
。2。ラージオブジェクトを参照しているユーザーがいます。スレッドのスナップショットは、ダンプスナップショットにあります。ダンプファイルが大きすぎる場合は、jvm監視ツールを使用して開くことができます。

36、OOM異常は2つのケースに分かれています。

1.メモリオーバーフローOOMがいっぱいになると、gcはオブジェクトをリサイクルします
。2。メモリリークはGCCになります。gcはオブジェクトをリサイクルできません。リストにオブジェクトを追加してください。このオブジェクトはリサイクルされません。

37.ダンプスナップショットとは何ですか?

ダンプスナップショット:ヒープと同じ大きさ、スナップショットはstw
1 と同じ大きさになります。メモリがオーバーフローしたときにヒープメモリスナップショットを出力します
-XX:+ HeapDumpOnOutOfMemoryError
この構成は、スナップショットをユーザーディレクトリまたはtomcatディレクトリに保存するか、-XX:HeapDumpPath = /tmp/heapdump.dumpは、指定されたパス
2、jatat -gcutil pid print gc実行時間、およびヒープ情報を表示します

38、JVMチューニングケース

1.若い世代のGCと古い世代のGCが頻繁にある
理由:1.スペースの保証が発生する2.ダイナミックエイジ
ソリューション:若い世代を拡張する
2. CMSの再マーキングに時間がかかる
理由:1.若い世代の
ソリューションが多すぎる:1.更新中ラベルを付ける前にY gCを1回使用します
2.若い世代を拡張して、ほとんどのオブジェクトが若い世代でリサイクルされるようにし、それによってO gcの数を減らします。
主な調整は、fullgcとmagior gcを減らすことです

39.その他

c.intern()//文字列を定数プールに移動します
定数プールは、ハッシュセット
javap -c xx.class逆アセンブリとして見ることができます

53件の元の記事の公開 Likes2 訪問1870

おすすめ

転載: blog.csdn.net/qq_42972645/article/details/104626619