1. Java でのガベージ コレクターの仕組み
ガベージ コレクターは、定期的に実行され、不要になったオブジェクトによって使用されているメモリを解放する優先度の低いプロセスです。ガベージ コレクターは、プログラムと並行して、別のスレッドでバックグラウンドで実行されます。ガベージ コレクションの基礎は参照カウントではなく、オブジェクトを 2 つのタイプ (到達可能と到達不能) に分離することです。オブジェクトは、別の到達可能な (生きている) オブジェクトによって参照されている場合、到達可能な (生きている) とみなされます。到達可能性はスレッドからカウントされます。実行中のスレッドは、誰も参照していなくても、常に到達可能 (生きている) とみなされます。Java のすべてのオブジェクトは、ヒープと呼ばれる特別なメモリ領域に格納されます。プログラム内のすべてのオブジェクトは、比較的単純なオブジェクトと「長期間存続する」オブジェクトの 2 つのタイプに分類できます。「長命」オブジェクトとは、多くのガベージ コレクションを経ても生き残ったオブジェクトのことです。ほとんどの場合、それらはプログラムの終了まで存在します。その結果、作成されたすべてのオブジェクトが保存される共通ヒープは、いくつかの部分に分割されました。最初の部分には美しい名前が付けられています - エデン (聖書の「エデンの園」)、オブジェクトは作成された後にここに置かれます。新しいオブジェクトを作成するときに、新しいオブジェクトにメモリが割り当てられるのはこの部分です。多くのオブジェクトを作成でき、この領域のスペースがなくなると、最初の「高速」ガベージ コレクションが開始されます。ガベージ コレクターは非常に賢く、ヒープ内にさらにあるもの (ガベージ オブジェクトか作業オブジェクト) に応じて作業アルゴリズムを選択すると言わなければなりません。ほとんどすべてのオブジェクトがガベージである場合、コレクターは「ライブ」オブジェクトをマークして別のメモリ領域に移動し、その後現在の領域が完全にクリーンアップされます。ゴミが少なく、その大部分が生き物で占められている場合は、ゴミにマークを付けて掃除し、残った物を整理します。少なくとも 1 回のガベージ コレクションで生き残ったすべてのオブジェクトが転送されるメモリ領域は、生存スペースと呼ばれます。一方、サバイバル スペースは世代に分かれています。各オブジェクトには、経験したガベージ コレクションの数に基づいて世代が割り当てられます。1 つある場合は「第 1 世代」に属し、5 つある場合は「第 5 世代」に属します。Eden と Survival Space は一緒に Young Generation と呼ばれるエリアを形成します。Young Generation に加えて、ヒープにはもう 1 つのメモリ領域、Old Generation (「旧世代」) があります。これらは、多くのガベージ コレクションを経ても生き残った、非常に長命なオブジェクトです。それらを他のものとは別に保管する方が有益です。そして、旧世代エリアがいっぱいの場合のみ、つまり プログラム内に存続期間の長いオブジェクトが多すぎてメモリが不足している場合でも、完全なガベージ コレクションが実行されます。1 つのメモリ領域だけでなく、通常は Java マシンによって作成されたすべてのオブジェクトが処理されます。当然のことながら、より多くの時間とリソースが必要になります。そのため、寿命の長いものは別々に保管することが決定されました。他のエリアでスペースがなくなると、いわゆる「迅速なガベージコレクション」が実行されます。カバーするエリアは 1 つだけなので、より経済的で高速です。最後に、古くから住んでいる居住者が住むエリアさえもすでに詰まっている場合は、全面的な清掃が必要になります。したがって、最も「重い」ツールは、必要がなくなった場合にのみアセンブラによって使用されます。
2. ガベージ コレクターにはどのような種類がありますか?
Java には 7 種類のガベージ コレクターがあります。
- シリアルガベージコレクター
- パラレルガベージコレクター
- CMS ガベージ コレクター
- G1 ガベージ コレクター
- イプシロン ガベージ コレクター
- Zガベージコレクター
- シェナンドー ガベージ コレクター
3. オブジェクトの「世代」とは何ですか
サバイバル スペース内のすべてのオブジェクトは世代に分割されます。各オブジェクトには、経験したガベージ コレクションの数に基づいて世代が割り当てられます。1 つある場合は「第 1 世代」に属し、5 つある場合は「第 5 世代」に属します。
4. SoftReference は何に使用されますか?
ソフト参照によってのみ参照されるオブジェクトは、プログラムのメモリが不足するとガベージ コレクションされる可能性があります。プログラムが突然メモリ不足になった場合、OutOfMemoryException をスローする前に、ガベージ コレクターはソフト リンクによって参照されるすべてのオブジェクトを削除し、プログラムにメモリを再度割り当てようとします。SoftReference によってのみ死なないように保たれているオブジェクトは、ガベージ コレクションが何度行われても生き残ることができますが、プログラムがメモリを使い果たすとおそらく破棄されます。
5. SoftReferenceの使用例
SoftReference は、キャッシュ用に特別に設計されました。クライアントプログラムがサーバープログラムに対してさまざまなデータを頻繁に要求するとします。次に、サーバー プログラムは、SoftReference を使用して、それらの一部をキャッシュできます。ソフト参照によって死から守られているオブジェクトがメモリの大部分を占めている場合、ガベージ コレクターはそれらを削除するだけで終わりです。
6. WeakReferenceの使用例
オブジェクトへの弱い参照しかない場合、このオブジェクトは生きていますが、次のガベージ コレクション中に破棄されます。WeakReference だけによって死なないようになっているオブジェクトは、次のガベージ コレクションでは生き残れません。
get()
ただし、それが発生するまでは、 WeakReference のメソッドを呼び出してそのメソッドを呼び出すか、他のことを行うことで取得できます。WeakReference の使用例は WeakHashMap です。
7. WeakHashMap が必要な理由
WeakHashMap は、キーが弱い参照 (WeakReference) である HashMap です。オブジェクトのペア (キーと値) を WeakHashMap に保存します。ただし、WeakHashMap はキーを直接参照するのではなく、WeakReference を通じて参照します。したがって、キーとして使用されているオブジェクトが到達不能になると、それらのオブジェクトは次のガベージ コレクション中に破棄されます。これは、それらの値が WeakHashMap から自動的に削除されることを意味します。WeakHashMap は、一部のオブジェクトの追加情報を保存するのに非常に便利です。まず、オブジェクト自体をキーとして使用すると、非常に簡単に取得できます。次に、オブジェクトが破棄されると、そのオブジェクトとそれに関連付けられたすべてのデータが HashMap から消えます。たとえば、プログラムには、いくつかのタスク オブジェクトの作業を監視し、それらに関する情報をログに書き込むスレッドがあります。その後、このスレッドは追跡されたオブジェクトをそのような WeakHashMap に保存できます。オブジェクトが不要になるとすぐに、ガベージ コレクターによってオブジェクトが削除され、WeakHashMap からのオブジェクトへの参照が自動的に削除されます。
8. ロガーとは何ですか
Logger オブジェクトは、特定のシステムまたはアプリケーション コンポーネントのメッセージをログに記録するために使用されます。ログとは、発生したイベントのリストです。ほとんどの場合、呼び出しに使用されたメソッド パラメーター、インターセプトされたすべてのエラー、および多くの中間情報に関する情報がログに書き込まれます。ロギングプロセス全体は 3 つの部分で構成されます。
- 最初の部分は情報収集です。
- 2 番目の部分は、収集された情報をフィルタリングすることです。
- 3 番目の部分は、選択された情報の記録です。
9. ロガーのセットアップ方法
- pom.xml に依存関係を追加します。
- log4j.properties ファイルをリソースに追加します。
通常、log4j ロガー設定は log4j.properties ファイルで設定されます。このファイルでは、データが書き込まれるオブジェクトである複数のアペンダーを指定できます。
- ビジネス ロジックを含むクラスに追加します
private static final Logger log = Logger.getLogger(ххх.class);
。
使用済み:
GO TO FULL VERSION