シナリオ
依存関係のあるアプリケーションを想定しましょう。依存関係は、jar ファイルの形式で提供されます。依存関係の jar ファイルには、多くのクラスが含まれています。アプリケーションは、依存関係 jar から 1 つのクラスのみを使用します。
質問
依存関係 jar に含まれる未使用のクラスは、アプリケーションによって (直接的および間接的に) 使用されていない場合でも、メモリ消費量の増加につながりますか?
クラスローダーの実装の問題だと思いますが、この質問ではクラスローダーの動作が本当に異なるのでしょうか? デフォルトの JRE / JDK クラスローダー、およびおそらく一般的なコンテナーとアプリケーション サーバーのクラスローダーについて、この質問に答えるだけで十分だと思います。
クラスローダは jar ファイル全体をロードしますか? 必要なクラスをロードするのは一時的なもので、その後jarファイルはメモリから削除されますか? それとも、未使用のクラスも含めて、すべてのクラスがロードされていますか?
バックグラウンド
プロジェクトを編成するとき、クラスなどを多くの小さなプロジェクトに分割する傾向があります。ディスク容量は比較的安価なので、ディスク容量を節約するためにこれを行うわけではありません。再利用性が向上するため、これを行います。小さなプロジェクトの数がかなり多くなったとしても、私は「依存地獄」をあまり恐れていません。私は依存関係を自動的に解決するために依存関係/ビルドツールを使用しています。
したがって、プロジェクト編成には、ディスクスペースの側面とコード/再利用性の側面があります。プロジェクト編成の 3 つ目の側面は、ランタイム/クラスローダーの側面です。アプリケーションがディスク容量を使い果たすことはめったにありませんが、環境によっては、メモリ不足は現実的なシナリオです。