インタビュアーから、JVMの悪臭を放つパフォーマンスの最適化について尋ねられました。わかりませんか?コレクションをお勧めします!

1つは、JVMパフォーマンス最適化のトピックです。

1.Javaクラスのロードプロセス

Javaクラスのロードには、次の7つのプロセスが必要です。

1.1。ロード

ロードはクラスロードの最初のプロセスです。この段階で、次の3つのことが完了します。

  • 完全修飾名でクラスのバイナリストリームを取得します。
  • バイナリストリームの静的ストレージ構造を、実行時データ構造のメソッドに変換します。
  • このクラスのデータアクセスエントリとして、このクラスのClassオブジェクトをメモリに生成します。

1.2。検証

検証の目的は、クラスとファイルのバイトストリーム内の情報が仮想マシンに害を及ぼさないことを確認することです。この段階で、次の4つの検証が主に完了します。

  • ファイル形式の検証:メジャーバージョン番号とマイナーバージョン番号が現在の仮想マシンの範囲内にあるかどうか、定数プール内の定数にサポートされていないタイプがあるかどうかなど、バイトストリームがファイル仕様に準拠しているかどうかを検証します。
  • メタデータ検証:このクラスに親クラスがあるかどうか、継承されていないクラスを統合しているかどうかなど、バイトコードによって記述された情報のセマンティック分析。
  • バイトコード検証:検証プロセス全体で最も複雑な段階です。検証データフローと制御フローの分析を通じて、主にメソッド本体の検証のために、プログラムのセマンティクスが正しいかどうかが判断されます。例:メソッドの型変換が正しいかどうか、ジャンプ命令が正しいかどうかなど。
  • シンボル参照の検証:このアクションは、主に解析アクションを正しく実行できることを確認するために、後続の解析プロセスで発生します。

1.3。準備

準備段階では、クラスの静的変数にメモリを割り当て、デフォルト値に初期化します。これらのメモリは、メソッド領域に割り当てられます。クラス内のインスタンス変数のメモリは、準備フェーズでは割り当てられません。インスタンス変数は、オブジェクトがインスタンス化されるときに、オブジェクトとともにJavaヒープに割り当てられます。

 public static int value=123;//在准备阶段value初始值为0 。在初始化阶段才会变为123 。

1.4。分析

この段階では、主にシンボル参照から直接参照への変換アクションが完了します。解析アクションは、必ずしも初期化アクションが完了する前である必要はなく、初期化後に行われる場合もあります。

1.5。初期化

初期化中のクラスロードの最後のステップである前のクラスロードプロセス。ただし、ユーザーアプリケーションは、カスタムクラスローダーを介してロード段階に参加できます。残りのアクションは、仮想マシンによって完全に支配および制御されます。初期化段階では、クラスで定義されたjavaプログラムコードが実際に実行されます。

1.6。使用

1.7。アンインストール

2.Javaメモリ割り当て

  • 登録:私たちはコントロールできません。
  • 静的ドメイン:staticによって定義された静的メンバー。
  • 定数プール:(最終的な)定数値と、コンパイル時に決定されて.classファイルに保存されるいくつかのテキスト変更されたシンボル参照(クラスとインターフェイスの完全修飾名、フィールドの名前と記述子、メソッドと名前と記述子) 。
  • 非RAMストレージ:ハードディスクなどの永続的なストレージスペース。
  • ヒープメモリ:newによって作成されたオブジェクトと配列は、Java仮想マシンの自動ガベージコレクターによって管理され、アクセス速度が遅くなります。
  • スタックメモリ:基本的なタイプの変数とオブジェクト参照変数(ヒープメモリスペースのアクセスアドレス)は高速で共有できますが、サイズと有効期間を決定する必要があり、柔軟性に欠けます。

2.1。Javaヒープの構造は何ですか?2ヒープ内の永続的な世代は何ですか?

JVMのヒープはランタイムデータ領域であり、クラスのすべてのインスタンスと配列にはヒープ上のメモリが割り当てられます。これは、
JVMの起動時に作成されます。オブジェクト
占有するヒープメモリは、ガベージコレクタである自動メモリ管理システムによって収集されます
ヒープメモリは、生きているオブジェクトと死んでいるオブジェクトで構成されています。生き残ったオブジェクトはアプリケーションからアクセス可能であり、ゴミ収集されません。デッドオブジェクトは、アプリケーションからアクセスできず、ガベージコレクターによって収集されていないオブジェクトです。ガベージコレクターがこれらのオブジェクトを収集するまで、それらはヒープメモリスペースを占有します。

3.クラスファイルをロードするJVMの原理とメカニズムを説明する2

Java言語は動的に解釈される言語であり、クラスはJVMにロードされた後にのみ実行できます。指定されたプログラムを実行すると、JVMは
、要件と特定のルールに従って、コンパイルされた.classファイルをメモリにロードし、それらを完全なJavaアプリケーションに編成します。このロードプロセスは、クラスローダーによって完了されます。具体的には、ClassLoaderとそのサブクラスによって実装されます。クラスローダー自体もクラスであり、その本質は、クラスファイルをハードディスクからメモリに読み取ることです。
クラスの読み込み方法は、暗黙的な読み込みと明示的な読み込みに分けられます。暗黙的なロードとは、プログラムが新しいメソッドを使用してオブジェクトを作成するときに、クラスローダーを暗黙的に呼び出して、対応するクラスをJVMにロードすることを意味します。ディスプレイの読み込みとは、class.forName()メソッドを直接呼び出して、必要なクラスをJVMに読み込むことです。

エンジニアリングプロジェクトは多くのクラスで構成されています。プログラムの起動時に、必要なクラスのみがJVMに読み込まれます。他のクラスは、使用された場合にのみ読み込まれます。この方法により、読み込み速度を上げることができます。一方、プログラムの実行時にメモリのオーバーヘッドを節約できます。さらに、Java言語では、各クラスまたはインターフェイスはfile.classに対応し、これらのファイルは動的にロードできるユニットと見なすことができるため、一部のクラスのみを変更する場合は、変更したクラスのみを再コンパイルする必要があります。このクラスは、すべてのファイルを再コンパイルせずに使用できるため、コンパイルが高速化されます。
Java言語では、クラスのロードは動的です。一度にすべてのクラスをロードしてから実行するのではなく、プログラムが実行する基本クラス(基本クラスなど)がJVMに完全にロードされるようにします。他のクラスについては、必要に応じてロードされます。
クラス読み込みの主な手順:

  • 負荷。検索パスに従って対応するクラスファイルを検索し、インポートします。
  • リンク。リンクは3つの小さなステップに分けることができます。
  • ロードするクラスファイルの正しさを確認してください。
  • クラス内の静的変数にストレージスペースを割り当てる準備をします。
  • 解決し、シンボル参照を直接参照に変換します(この手順はオプションです)
  • 初期化。静的変数と静的コードブロックの初期化作業を実行します。

4. GCとは何ですか?なぜGCがあるのですか?

GCはガベージコレクション(GabageCollection)を意味します。メモリ処理はプログラマーが問題を起こしやすい場所です。メモリのリサイクルを忘れたり間違ったりすると、プログラムやシステムが不安定になったり、クラッシュしたりする可能性があります。Javaが提供するGC機能は、オブジェクトが効果を超えているかどうかを自動的に監視できます。したがって、ドメインはメモリを自動的に再利用するという目的を達成します。Java言語は、割り当てられたメモリを解放するための表示操作方法を提供しません。

5. Javaガベージコレクションメカニズムについて簡単に説明します)

Javaでは、プログラマーはオブジェクトのメモリを明示的に解放する必要はありませんが、仮想マシン自体によって実行されます。JVMには、ガベージコレクションスレッドがあります。これは優先度が低く、通常の状況では実行されません。仮想マシンがアイドル状態であるか、現在のヒープメモリが不足している場合にのみトリガーされます。オブジェクトを参照し、コレクションに追加して、リサイクルのためにリサイクルします。

6.オブジェクトが生きているかどうかを判断する方法(またはGCオブジェクトを判断する方法)

オブジェクトが生きているかどうかを判断する方法は2つあります。

6.1。参照カウント

いわゆる参照カウント方式とは、オブジェクトごとに参照カウンターを設定することで、このオブジェクトへの参照がある場合はカウンターを1つ増やし、参照が無効な場合はカウンターを1つ減らします。オブジェクトの参照カウンタがゼロの場合、オブジェクトが参照されていない、つまり「デッドオブジェクト」であり、ガベージコレクションされることを意味します。
参照カウント方法には、循環参照問題を解決できない、つまりオブジェクトAが参照されている場合の欠点があります。オブジェクトBとオブジェクトBはオブジェクトAを参照しているため、現時点ではAオブジェクトとBオブジェクトの参照カウンターはゼロではなく、ガベージコレクションを完了できないため、主流の仮想マシンはこのアルゴリズムを採用していません。

6.2。到達可能性アルゴリズム(リファレンスチェーン方式)

このアルゴリズムのアイデアは、GCルートと呼ばれるオブジェクトから下向きに検索することです。オブジェクトをGCルートにリンクする参照チェーンがない場合、このオブジェクトは使用できません。JavaでGCルートとして使用できるオブジェクトは次のとおりです。

  • 仮想マシンスタックで参照されるオブジェクト
  • メソッド領域の静的プロパティによって参照されるオブジェクト•メソッド領域の定数プールによって参照されるオブジェクト
  • ローカルメソッドスタックJNIによって参照されるオブジェクト
    これらのアルゴリズムはオブジェクトをリサイクルできるかどうかを判断できますが、上記の条件が満たされた場合、オブジェクトは必ずしもリサイクルされるとは限りません。オブジェクトがGCルートに到達できない場合、オブジェクトはすぐには回復されませんが、回復を伴う死の段階にあります。真に回復するには、2つのマーキングを通過する必要が
    あります到達可能性分析でオブジェクトがGCに接続されていない場合ルートの参照チェーンは、最初にマークされ、フィルターが実行されます。フィルター条件は、finalize()メソッドを実行する必要があるかどうかです。オブジェクトがfinalize()メソッドをカバーしていないか、仮想マシンによって呼び出されている場合、それは不要であると見なされます。オブジェクトがfinalize()メソッドを実行する必要がある場合、オブジェクトはF-Queueと呼ばれるペアキューに配置され、仮想マシンは
    Finalize()スレッドをトリガーして実行します。このスレッドは優先度が低く、仮想です。マシンは、実行が終了するのを待つことを約束しません。これは、finalize()が遅いかデッドロックが発生すると、F-Queueキューが常に待機し、メモリ回復システムがクラッシュするためです。GCは、Fキュー内のオブジェクトに2回目のマークを付けます。この時点で、オブジェクトは「リサイクル」コレクションから削除され、リサイクルを待機します。

7.ごみ収集の利点と原則)および2つのリサイクルメカニズムを検討する)

Java言語の注目すべき機能は、ガベージコレクションメカニズムの導入です。これにより、C ++プログラマーは、最も厄介なメモリ管理の問題を簡単に解決できます。これにより、Javaプログラマーは、プログラムを作成するときにメモリ管理を考慮する必要がなくなります。ガベージコレクションメカニズムにより、Javaのオブジェクトには「スコープ」の概念がなくなり、オブジェクト参照のみに「スコープ」があります。ガベージコレクションは、メモリリークを効果的に防止し、使用可能なメモリを効果的に使用できます。ガベージコレクターは通常、別個の低レベルスレッドとして実行されます。予測できない状況では、メモリヒープ内の、死亡した、または長期間使用されていないオブジェクトがクリーンアップされてリサイクルされます。プログラマーは、ガベージコレクターをリアルタイムで呼び出すことはできません。オブジェクトまたはすべてのオブジェクトはゴミ収集されます。
リサイクルメカニズムには、世代別コピーガベージコレクション、マーク付きガベージコレクション、およびインクリメンタルガベージコレクションが含まれます。

8.ガベージコレクターの基本原則は何ですか?ガベージコレクターはすぐにメモリを再利用できますか?ガベージコレクションについて仮想マシンに事前に通知する方法はありますか?

GCの場合、プログラマーがオブジェクトを作成すると、GCはオブジェクトのアドレス、サイズ、および使用状況の監視を開始します。通常、GCは有向グラフを使用して、ヒープ内のすべてのオブジェクトを記録および管理します。このようにして、どのオブジェクトが「到達可能」で、どのオブジェクトが「到達不能」であるかを判別します。一部のオブジェクトが「到達不能」であるとGCが判断した場合、GCはこれらのメモリスペースを再利用する責任があります。できる。プログラマーは手動でSystem.gc()を実行して、GCに実行を通知できますが、Java言語仕様は、GCが実行されることを保証しません。

9. Javaでメモリリークが発生しますか?簡単に説明してください)

いわゆるメモリリークとは、プログラムで使用されなくなったオブジェクトまたは変数がメモリ内で占有されていることを意味します。Javaにはガベージコレクションメカニズムがあり、オブジェクトが参照されなくなったとき、つまりオブジェクトが孤立したときに、ガベージコレクターによってオブジェクトがメモリから自動的に削除されるようにすることができます。Javaはガベージコレクションの管理に有向グラフを使用するため、参照サイクルの問題を排除できます。たとえば、相互に参照する2つのオブジェクトがあります。ルートプロセスに到達できない限り、GCは次のコードのようにそれらをリサイクルすることもできます。この状況でメモリの回復を確認できます。

*/
public static void main(String[] args) throws IOException {
    
    
// TODO Auto-generated method stub try { gcTest();
} catch (IOException e) {
    
    
// TODO Auto-generated catch block e.printStackTrace();
}
System.out.println("has exited gcTest!"); System.in.read();
System.in.read(); System.out.println("out begin gc!"); for(int i=0;i<100;i++)
{
    
    
System.gc(); System.in.read(); System.in.read(); }
}
private static void gcTest() throws IOException {
    
     System.in.read();
System.in.read();
Person p1 = new Person(); System.in.read(); System.in.read();
Person p2 = new Person(); p1.setMate(p2); p2.setMate(p1);
System.out.println("before exit gctest!"); System.in.read(); System.in.read();
System.gc(); System.out.println("exit gctest!");
}
private static class Person {
    
    
byte[] data = new byte[20000000]; Person mate = null; public void setMate(Person other) {
    
    
mate = other;
}
}
}

Javaでのメモリリーク:寿命の長いオブジェクトは寿命の短いオブジェクトへの参照を保持し、メモリリークが発生する可能性があります。ただし、寿命の長いオブジェクトは参照を保持するため、寿命の短いオブジェクトは不要になります。リサイクルできませんこれはJavaのメモリリークのシーンです素人の言葉で言えば、プログラマーはオブジェクトを作成する可能性があり、そのオブジェクトは将来使用されることはありませんが、オブジェクトは参照されています、つまり、オブジェクトは役に立たないができませんガベージコレクターによって再利用された、これはjavaで発生する可能性のあるメモリリークです。たとえば、キャッシュシステムでは、オブジェクトをキャッシュ(たとえば、グローバルマップオブジェクト)にロードしてから、使用しません。このオブジェクトはキャッシュによって参照されていますが、使用されなくなりました。
Javaでメモリリークをチェックするには、プログラムの最後までさまざまな分岐状況を完全に実行させ、オブジェクトが使用されているかどうかを確認する必要があります。使用されていない場合は、オブジェクトがメモリリークであると判断できます。
外部クラスのインスタンスオブジェクトのメソッドが内部クラスのインスタンスオブジェクトを返す場合、外部クラスインスタンスオブジェクトが使用されなくなった場合でも、この内部クラスオブジェクトは長期間参照されますが、内部クラスは外部クラスインスタンスオブジェクトを保持するため、これは外部クラスオブジェクトはガベージコレクションされないため、メモリリークも発生します。
次のコンテンツはインターネットからのものです(主な機能は、スタック内の要素をクリアすることであり、配列から完全に削除するのではなく、ストレージの総数を減らすことです。これよりもうまく書き込むことができ、要素を削除しています同時に、それを配列から消し、その要素の位置の値をnullに設定します):
私はそのスタックよりも古典的な例を本当に考えることができないので、他の人の例を引用する必要があります、次のように例は私が思っていたものではありませんでしたが、本の中で見ました。もちろん、本の中で読んでいなかったら、しばらくして自分で考えたかもしれませんが、その時は自分の考えだと言って、誰も信じませんでした。

public class Stack {
    
    
private Object[] elements=new Object[10]; private int size = 0
;
public void push(Object e){
    
     ensureCapacity(); elements[size++] = e;
}
public Object pop(){
    
    
if( size == 0) throw new EmptyStackException(); return element

 s[--size];
}
private void ensureCapacity(){
    
     if(elements.length == size){
    
     Object[] oldElements = elements;
elements = new Object[2 * elements.length+1]; System.arraycopy (oldElements,0, elements, 0,
size);
}
}
}

上記の原則は非常に単純なはずです。スタックに10個の要素が追加され、すべてがポップアップします。スタックは空ですが、必要なものはありませんが、これはリサイクルできないオブジェクトであり、2つのメモリリークのみに対応します。状態:役に立たず、リサイクルできません。しかし、そのようなものが存在しても必ずしも結果につながるわけではありません。このスタックの使用量が少ないと、数Kのメモリが無駄になります。とにかく、メモリはすべてGにありますが、どこに影響しますか?このことはすぐにリサイクルされます、それは何が重要ですか?2つの例を見てみましょう。

public class Bad{
    
    
public static Stack s=Stack(); static{
    
     s.push(new Object());
s.pop(); //这里有—个对象发生内存泄露
s.push(new Object()); //上面的对象可以被回收了,等于是自 愈了
}
}

静的であるため、プログラムが終了するまで存在しますが、自己修復機能があることもわかります。つまり、スタックに最大100個のオブジェクトがある場合、最大100個のオブジェクトしかリサイクルできません。実際、これは非常に重要です。 Stackが100個の参照を内部に保持していることは簡単に理解できます。最悪の場合、新しいイニシアチブを設定すると、以前の参照が自然に消えてしまうため、それらがすべて役に立たないことが
あります。メモリリークのもう1つのケース:オブジェクトがHashSetコレクションの後、ハッシュ値の計算に関与するオブジェクトのフィールドは変更できません。変更しないと、オブジェクトの変更されたハッシュ値は、HashSetコレクションに最初に格納されたときのハッシュ値とは異なります。この場合、containsメソッドがオブジェクトの現在の参照をパラメータとして使用してHashSetコレクションからオブジェクトを取得しても、オブジェクトが見つからないという結果が返されるため、HashSetコレクションから現在のオブジェクトを個別に削除できなくなり、メモリリークが発生します。 。

10.ディープコピーとシャローコピー)

簡単に言えば、それはコピーとクローンです。

Person p=new Person(“张三”);

浅いコピーとは、オブジェクト内のデータメンバーに値を割り当てることです。動的メンバーまたはポインターがある場合、エラーが報告されます。
ディープコピーは、オブジェクトに存在する動的メンバーまたはポインターのメモリスペースを再度開くことです。

11. System.gc()とRuntime.gc()は何をしますか?

これらの2つの方法は、JVMにガベージコレクションを実行するように促すために使用されます。ただし、すぐに開始するか、ガベージコレクションを遅らせるかは、JVMによって異なります。

12. finalize()メソッドはいつ呼び出されますか?デストラクタ(finalization)の目的は何ですか?

ガベージコレクター(ガベージコレクター)がオブジェクトのリサイクルを決定すると、オブジェクトのfinalize()メソッドが実行されますが、残念ながらJavaでは、メモリが常に十分である場合、ガベージコレクションが続行されない可能性があります。つまり、ファイラライズされます。 ()は決して実行されないかもしれません、明らかに仕上げ作業をするためにそれを頼りにすることは信頼できません。では、finalize()は正確に何をするのでしょうか?その主な目的は、特別なチャネルによって割り当てられたメモリを再利用することです。Javaプログラムにはガベージコレクターがあるため、通常の状況では、メモリの問題についてプログラマーが心配する必要はありません。ただし、Java以外のプログラム(CまたはC ++)を呼び出すJNI(Java Native Interface)があり、finalize()の仕事は、メモリのこの部分を再利用することです。

13.オブジェクト参照がnullに設定されている場合、ガベージコレクターは、オブジェクトが占有しているメモリをすぐに解放しますか?

いいえ、次のゴミ収集サイクルで、このオブジェクトはリサイクル可能になります。

14.分散ガベージコレクション(DGC)とは何ですか?どのように機能しますか?

DGCは分散ガベージコレクションと呼ばれます。RMIはDGCを使用して自動ガベージコレクションを実行します。RMIには仮想マシン全体のリモートオブジェクトへの参照が含まれているため、ガベージコレクションは困難です。DGCは、参照カウントアルゴリズムを使用して、リモートオブジェクトの自動メモリ管理を提供します。

15.シリアルコレクターとスループットコレクターの違いは何ですか?

スループットコレクターは、中規模および大規模のデータアプリケーションに使用される新世代のガベージコレクターの並列バージョンを使用します。シリアルコレクターは、ほとんどの小さなアプリケーションに十分です(最新のプロセッサーでは約100Mのメモリが必要です)。

16. Javaの場合?オブジェクトをガベージコレクションできるのはいつですか?

現在オブジェクトを使用しているアプリケーションがオブジェクトにアクセスできなくなった場合、オブジェクトをリサイクルできます。

17. Javaメモリの割り当てと回復の戦略、およびマイナーGCとメジャーGCについて簡単に説明します)

  • オブジェクトは最初にヒープのエデン領域に割り当てられます
  • 大きな物は直接老後を迎えます
  • 寿命の長いオブジェクトは直接古い時代に入ります。
    割り当てのためにエデンエリアに十分なスペースがない場合、仮想マシンはマイナーGCを実行します。マイナーGCは通常、若い世代のエデンエリアで発生します。このエリアのオブジェクトは寿命が短く、Gcが頻繁に発生する傾向があり、回復速度が速くなります。フルGC /メジャーGCは古い世代で発生し、通常の状況では、古い世代をトリガーします。マイナーGCはGC中にトリガーされませんが、構成により、フルGCの前にマイナーGCを実行できるため、旧世代の回復速度を上げることができます。

18.JVMの永続的な生成でガベージコレクションが発生しますか?

ガベージコレクションはパーマネントジェネレーションでは発生しません。パーマネントジェネレーションが満杯またはクリティカル値を超えると、フルガベージコレクション(フルGC)がトリガーされます。
注:Java 8では、永続的な生成が削除され、メタデータ領域と呼ばれる新しいネイティブメモリ
領域が追加されました

19.Javaでのガベージコレクションの方法は何ですか?

Mark-Clear:これはガベージコレクションアルゴリズムの最も基本的なものです。名前からわかるように、どのオブジェクトをリサイクルするかをマークして、均一に収集するという考え方です。この方法は簡単ですが、2つの主な問題があります。

  1. 効率は高くなく、マーキングと除去の効率は非常に低いです。
  2. 多数の不連続メモリフラグメントが生成されます。これにより、プログラムが将来より大きなオブジェクトを割り当てるときに、連続メモリが不十分なため、GCアクションが事前にトリガーされます。
    コピーアルゴリズム:効率の問題を解決するために、コピーアルゴリズムは、使用可能なメモリを容量に応じて2つの等しい部分に分割し、一度に1つだけを使用します.1つのメモリが使い果たされると、残っているオブジェクトが2番目のメモリにコピーされます。 、次に、メモリの最初のブロックを一度にクリアしてから、2番目のブロックのオブジェクトを最初のブロックにコピーします。しかし、このように、メモリのコストが高すぎて、一般的なメモリは基本的に毎回無駄になります。
    そのため、アルゴリズムが改善され、メモリ領域が1:1で分割されなくなりましたが、メモリは8:1:1の3つの部分に分割され、大きい方がEden領域に割り当てられ、残りは2つの小さい部分に割り当てられます。メモリ領域はサバイバー領域と呼ばれます。エデンエリアは毎回最初に使用されます。エデンエリアがいっぱいになると、オブジェクトは2番目のメモリエリアにコピーされ、次にエデンエリアがクリアされます。この時点で生きているオブジェクトが多すぎてサバイバーが足りない場合、これらのオブジェクトは通過します。配布保証メカニズムは、古い時代にコピーされます。(javaヒープは新世代と旧世代に分けられます)
    マーキング仕上げ:このアルゴリズムは、主にマーキングクリアと多数のメモリフラグメントの生成の問題を解決するためのものです。オブジェクトの生存率が高い場合は、レプリケーションアルゴリズムの効率の問題も解決します。違いは、オブジェクトがクリアされると、リサイクル可能なオブジェクトが一方の端に移動され、次に端の境界の外側のオブジェクトがクリアされるため、メモリの断片化が発生しないことです。
    世代別コレクション:現在の仮想マシンのガベージコレクションのほとんどはこの方法を使用しており、オブジェクトのライフサイクルに応じてヒープを若い世代と古い世代に分割します。新世代では、オブジェクトの寿命が短いため、リサイクルされるたびに多数のオブジェクトが停止するため、この時点でレプリケーションアルゴリズムが使用されます。古い時代のオブジェクトは生存率が高く、割り当てを保証するための余分なスペースはありません。

20.クラスローダーとは何ですか?クラスローダーとは何ですか?

クラスの許可を通じてクラスのバイナリバイトストリームへのアクセスを実現するコードブロックは、クラスローダーと呼ばれます。ローダーには主に4つのタイプがあります。

  • ブートクラスローダー(BootstrapClassLoader)は、Javaコアクラスライブラリをロードするために使用され、
    Javaプログラムから直接参照することはできません
  • 拡張クラスローダー:Java拡張ライブラリをロードするために使用されます。Java仮想マシンの実装は、拡張ライブラリディレクトリを提供します。クラスローダーは、このディレクトリでJavaクラスを見つけてロードします。
  • システムクラスローダー:JavaアプリケーションのCLASSPATHに従ってJavaクラスをロードします。一般的に、Javaアプリケーションクラスはそれによってロードされます。ClassLoader.getSystemClassLoader()によって取得できます。
  • ユーザー定義のクラスローダーは、java.lang.ClassLoaderクラスを継承することによって実装されます。

21.クラスローダーの親委任モデルメカニズム?

クラスがクラスの読み込み要求を受信すると、クラスはそれ自体では読み込まれませんが、親クラスに委任され、親クラスによって読み込まれます。この時点で親クラスを読み込めない場合は、サブクラスとサブクラスにフィードバックされます。クラスのロードを完了します。

おすすめ

転載: blog.csdn.net/Java_Yhua/article/details/111220478