Java (JVM) でのガベージ コレクションの仕組み
出典:
Dゾーン
Java でのガベージ コレクション プロセス
Java
ガベージ コレクションはメモリの割り当てと解放を自動的に行うため、開発者はメモリを管理するための別のプログラムを作成する必要がありません。これは、Java でプログラミングする主な利点の 1 つです。Java プログラムが JVM 上で実行されるたびに、オブジェクトがヒープ上に作成され、プログラムに割り当てられたメモリの一部を表します。時間が経つと、一部のアイテムは不要になります。ガベージ コレクターは、これらの未使用のオブジェクトを見つけて削除し、メモリを解放します。
ガベージ コレクターは、メモリ ヒープを評価した後、使用中のオブジェクトと使用されていないオブジェクトを判断し、未使用のオブジェクトを削除します。使用または参照されたオブジェクトは、プログラムの一部がそのオブジェクトへのポインターを保持していることを意味します。オブジェクトが使用されなくなったり、参照されなくなったりすると、そのオブジェクトはプログラムのどの部分からも参照されなくなります。したがって、参照されていないオブジェクトによって使用されているメモリは、ガベージ コレクションを実行することで解放できます。
メモリの解放は、次の 3 つの主なプロセスで説明できます。
- マーキング。
- 通常の取り外し。
- 圧縮を伴う除去。
マーキングは、ガベージ コレクターによって使用されているメモリ部分と使用されていないメモリ部分を識別するプロセスです。通常、ラベル付けは最初のステップです。
通常の削除は、参照されていないオブジェクトを削除し、参照されたオブジェクトとポインターを空き領域に残すプロセスです。
圧縮削除- 未参照のオブジェクトの削除に加えて、残りの参照オブジェクトを圧縮し、オブジェクトを一緒に移動して、新しいメモリの割り当てをより簡単かつ迅速に行います。
JVM ヒープ メモリ
若い世代
新しく作成されたオブジェクトは若い世代から始まります。新しいオブジェクトがここに住み始めるため、苗床とも呼ばれます。Young Generation は、すべての新しいオブジェクトが開始される Eden スペースと、単一のガベージ コレクション サイクルで生き残った後にオブジェクトが Eden から移動される 2 つの Survivor スペースに分かれています。これらは、オブジェクトが Young Generation ガベージ コレクターによって収集されるときに、再ガベージ コレクションを引き起こします。
Eden Space すべての新しいオブジェクトは、最初に Eden Space で作成されます。マイナー ガベージ コレクションは、JVM によって決定されたしきい値に達すると起動されます。前述のオブジェクトは、Eden Space から最初の保存スペース (「Eden」および「from」 -> 「to」) に移動されます。Eden Space がクリアされると、参照されていないオブジェクトが削除されます。
Survivor 0 (S0) および Survivor 1 (S1) 両方の Survivor (From および To) フィールドは空白で始まります。ガベージ コレクションが再び発生すると、参照されているすべてのオブジェクトが残りのスペースに移動されます。ガベージコレクションが終了すると、生存者の「from」と「to」の場所(名前)が入れ替わります。前回のガベージ コレクション中に S1 が「to」役割にあった場合、S1 はいっぱいになり、「from」役割になります。したがって、S0が空の場合は「to」となります。
旧世代
マイナー ガベージ コレクションの後、古いオブジェクトが特定の年齢のしきい値 (最新の JVM のデフォルトのしきい値は 15 ガベージ コレクション サイクルに設定されています) に達すると、それらのオブジェクトは、存続期間の長いオブジェクトとともに、若い世代から古い世代に移動します。マイナー ガベージ コレクタが引き続き発生し、オブジェクトが旧世代領域に移動し続けると、領域が埋まり始め、大規模なガベージ コレクションが発生します。基本的なガベージ コレクションは、オブジェクトが旧世代のガベージ コレクターによって収集されるときに発生します。
永続的な世代
クラスやメソッドなどのメタデータは永続世代に保存されます。使用されなくなったクラスは、ガベージ コレクターによってクラスから削除できます。フル ガベージ コレクションでは、すべての世代の未使用のオブジェクトが収集されます。
ガベージ コレクションの種類
ヒープ内のさまざまな部分をクリーンアップするガベージ コレクションは、マイナー、メジャー、フル ガベージ コレクションと呼ばれることがよくあります。ただし、マイナー、メジャー、フルという用語は適切な定義なしに広く使用されているため、これらすべての種類のガベージ コレクションについて説明します。
マイナーガベージコレクション
Young Generation スペースからのガベージのコレクションは、マイナー ガベージ コレクションと呼ばれます。このタイプのビルドは、JVM が新しいオブジェクトにスペースを割り当てられない場合、つまり Eden スペースがいっぱいの場合に常にトリガーされます。したがって、選択率が高くなるほど、マイナー ガベージ コレクションがより頻繁に発生します。
主要なガベージ コレクション
Major Garbage Collection は Tenured (古いスペース) をクリーンアップします。旧世代は規模が大きいため、集合が発生する頻度は若い世代よりも低くなります。オブジェクトが旧世代から消えると、「メジャー ガベージ コレクション」が発生したと言われます。旧世代のコレクターは、若い世代からの昇進の失敗を避けるために、いつ収集を開始する必要があるかを予測しようとします。コレクターは旧世代のフィルしきい値を監視し、そのしきい値を超えると収集を開始します。このしきい値がプロモーション要件を満たすのに十分でない場合は、「フル ガベージ コレクション」が開始されます。
フルガベージコレクション
フル ガベージ コレクションは、新しいスペースと古いスペースの両方をすべてクリーンアップします。多くの人が、メジャー (OLD 世代のみ) とフル GC (ヤング + OLD (ヒープ)) を混同しています。フル ガベージ コレクションには、古い世代を組み立てて圧縮した後、若い世代から古い世代までのすべての生きているオブジェクトのプロモーションが含まれます。完全なガベージ コレクションは、Stop-the-World の停止となります。これにより、新しいオブジェクトが割り当てられず、コレクターの実行中にオブジェクトが使用できなくなることがなくなります。
技術面接での Spring に関する 15 の重要な質問
出典:
Dev.to Spring Framework は、Java プラットフォーム用のユニバーサル フレームワークです。そのコア機能は任意の Java アプリケーションで使用でき、Java EE ベースの Web アプリケーションを作成するための拡張機能もあります。Spring コーディングに関する面接の質問と回答のリストを次に示します。2021 年の技術面接の準備に役立つことを願っています。
1. 春とは何ですか?
回答:
Spring は、 Java アプリケーションを開発するためのオープンソース フレームワークです。Spring Framework のコア機能は任意の Java アプリケーションの開発に使用でき、拡張機能を使用して Java EE プラットフォームに基づいた Web アプリケーションを作成することもできます。Spring フレームワークは、POJO (Plain Old Java Object) ベースのモデルを組み込むことで、開発で J2EE を使いやすくし、プログラミングの実践を改善することを目的としています。
2. Spring フレームワークにおける Bean のデフォルトのスコープは何ですか?
回答: Bean のデフォルトのスコープは
シングルトン(設計パターン) です。
3. Bean ワイヤリングとは何ですか?
回答:
Bean ワイヤリングは、Spring コンテナ内のアプリケーション コンポーネント (Bean) 間の関連付けを作成する行為です。
4. Spring Securityとは何ですか?
回答: Spring Security は、Java アプリケーションに認証および認可メソッドを提供することに重点を置いた Spring フレームワークの別個のモジュールです。また、CSRF 攻撃などの最も一般的なセキュリティ脆弱性も修正されます。Web アプリケーションで Spring Security を使用するには、簡単なアノテーション @EnableWebSecurity から始めることができます。
5. Bean 定義には何が含まれますか?
回答: Bean 定義には、コンテナーが次のことを知る必要がある構成メタデータと呼ばれる情報が含まれています。
- Bean の作成方法。
- Bean のライフサイクルの詳細。
- Bean の依存関係。
6. Spring Boot とは何ですか?
回答: Spring Boot は、最小限のコードで Spring アプリケーションを起動して実行できるように、定型的な構成を削減するための事前構成されたフレームワークのセットを提供するプロジェクトです。
7. DispatcherServlet とは何ですか?また何に使用されますか?
回答: DispatcherServlet は、Spring MVC アプリケーションへのすべての受信 Web リクエストを処理するフロント コントローラー設計パターンの実装です。フロント コントローラー パターン (エンタープライズ アプリケーション デザイン パターン) は、リクエスト全体を受け取り、それを実際の処理のためにアプリケーションのさまざまなコンポーネントにルーティングすることを仕事とする Web アプリケーションの一般的なパターンです。Spring MVC では、リクエストを処理するための正しいコントローラーを見つけるために DispatcherServlet が使用されます。これは、ハンドラー マッピング (@RequestMapping アノテーションなど) を使用して行われます。
8. spring-mvc.jar はクラスパスに必要ですか、それとも spring-core の一部ですか?
回答: Spring-mvc.jar は spring-core の一部です。つまり、Java プロジェクトで Spring MVC フレームワークを使用したい場合は、アプリケーションのクラスパスに spring-mvc.jar を含める必要があります。Java Web アプリケーションでは、通常、spring-mvc.jar は /WEB-INF/lib フォルダーに配置されます。
9. Spring を使用する利点は何ですか?
回答: 以下は Spring Framework を使用する利点のリストです。
- 軽量– サイズと透明度に関しては、スプリングは比較的軽量です。Spring Framework の基本バージョンは約 2 MB です。
- 制御の反転 (IOC) - Spring では、制御の反転手法を使用して疎結合が実現されます。オブジェクトは、依存オブジェクトを作成したり検索したりするのではなく、依存関係を提供します。
- アスペクト指向- Spring はアスペクト指向プログラミングをサポートし、アプリケーションのビジネス ロジックをシステム サービスから切り離すことで一貫した開発を保証します。
- コンテナ- Spring Container はオブジェクトを作成し、それらをバインドし、構成し、作成から破棄までオブジェクトを管理します。
- MVC フレームワーク- Spring Web フレームワークは、Struts などの Web フレームワークや、過度に設計された Web フレームワークやあまり人気のない Web フレームワークの代替となる、適切に設計された MVC Web フレームワークです。
- トランザクション管理- Spring には、ローカル トランザクション (単一データベースを使用するなど) またはグローバル トランザクション (JTA を使用するなど) に拡張できる一貫したトランザクション管理インターフェイスがあります。
- 例外処理- Spring は、テクノロジ固有の例外 (JDBC、Hibernate、または JDO によってスローされる例外など) を一貫性のある未チェックの例外に変換するための便利な API を提供します。
10. 春豆とは何ですか?
回答: Spring Bean は、Spring Container によって管理されるオブジェクトのインスタンスです。これらはフレームワークによって作成および接続され、「オブジェクト バッグ」(コンテナ) に配置され、後でそこから取得できます。ワイヤリングは依存関係の注入を構成するものです。つまり、「これが必要です」と言うだけで、フレームワークは特定のルールに従ってそのオブジェクトを取得します。
11. Core Container モジュールの目的は何ですか?
回答: カーネル コンテナは、Spring フレームワークのコア機能を提供します。メインコンテナの主なコンポーネントは、Factory パターンの実装である BeanFactory です。BeanFactory は、反転制御を使用して、構成およびアプリケーション仕様の依存関係を実際のアプリケーション コードから分離します。
12. アプリケーションコンテキストとは何ですか?
回答: 一見すると、アプリケーション コンテキストは Bean ファクトリと同じです。どちらも Bean 定義をロードし、Bean をバンドルして、要求に応じて配布します。ただし、次のような機能も提供します。
- 国際化のサポートを含む、テキスト メッセージを解決するためのツール。
- ファイル リソースをダウンロードする一般的な方法。
- リスナーとして登録されている Bean のイベント。
13. Java Server Faces (JSF) を Spring と統合するにはどうすればよいですか?
回答: JSF と Spring は、特に制御の反転サービスの分野で、同じ機能の一部を共有しています。faces-config.xml 構成ファイルで JSF マネージド Bean を宣言すると、FacesServlet が起動時にその Bean をインスタンス化できるようになります。JSF ページは、これらの Bean とそのすべてのプロパティにアクセスできます。JSF と Spring は 2 つの方法で統合できます。
DelegatingVariableResolver : Spring には、JSF と Spring を一緒に使用できるようにする JSF 変数リゾルバーが付属しています。DelegatingVariableResolver は、まず値の検索を基礎となる JSF 実装のデフォルトのインタープリターに委任し、次に Spring WebApplicationContext の「ビジネス コンテキスト」に委任します。これにより、JSF 管理の Bean に依存関係を簡単に注入できるようになります。
FacesContextUtils : カスタム VariableResolver は、そのプロパティをfaces-config.xml内のBeanにマッピングするときに適切に機能します。ただし、Bean をキャプチャする必要がある場合は、FacesContextUtils クラスを使用すると簡単になります。これは、ServletContext パラメーターではなく FacesContext パラメーターを受け入れることを除いて、WebApplicationContextUtils に似ています。
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext (FacesContext.getCurrentInstance ());
14. Spring MVC フレームワークとは何ですか?
回答:
Spring Web MVCフレームワークは、柔軟で疎結合な Web アプリケーションの開発に使用できるモデル ビュー コントローラー アーキテクチャと事前構築されたコンポーネントを提供します。MVC パターンにより、アプリケーションのさまざまな側面 (入力ロジック、ビジネス ロジック、UI ロジック) が分離され、これらの要素間の疎結合が可能になります。
15. Spring ではイベント処理はどのように機能しますか?
回答:
ApplicationContextでの処理は、 ApplicationEventクラスと
ApplicationListenerインターフェイスを通じて提供されます。つまり、Bean が
ApplicationListenerを実装している場合、 ApplicationEvent がApplicationContextに発行されるたびに、その Bean が登録されます。読んでいただきありがとうございます。技術面接も頑張ってください!
GO TO FULL VERSION