3 Gbのjarファイルがあり、アプリケーションがその中の小さなクラスのみを使用しているとしましょう。JVMはjarファイル全体をメモリにロードしますか、それとも目次を読み取り、必要な部分のみをロードしますか?この動作は制御可能ですか?
4 に答える
JVMは、呼び出されたときにJarから必要なクラスのみをロードします。アプリケーションにクラスが必要な場合は、そのクラスと他のすべての依存クラスがロードされます。確かではありませんが、これはクラスパスからクラスを見つけてロードするクラスローダーの責任だと思います。
JARファイルはzipファイルの形式です。
これらの処理方法は、JREに大きく依存します。
古いバージョンのSunJREは、ファイル全体をメモリマップするために使用されていました。これにより論理メモリが割り当てられますが、必ずしもデータがディスクからロードされるとは限りません。(32ビットWindowsは、他のOSで割り当てることはできますが、通常、3 GBの連続したメモリを割り当てることはできません)。
現在の動作は、Windowsではファイルの後ろにある中央ディレクトリをメモリマップすることだと思います。他のOSでは、それはただ読まれます。これは#define
、ソースのsによって制御されます。
JDK7は他のことをする可能性があります。
クラスは通常、遅延してロードされます。リソースは毎回再読み込みされます。java.util.ResourceBundle
キャッシュ。
それは完全にJVMとクラスローダーに依存します。JVM仕様では、クラスは最初のアクティブな使用時にロードされているように見える必要があると指定されています。クラスローダーは、予想よりも早くいくつかのクラスをロードできます。実際には、ほとんどのクラスローダーはロードを可能な限り遅らせます。
デフォルトのクラスローダーは、必要なときに必要なものだけをロードします。CLASSPATHに10MBのJARがあり、必要な.classファイルが1つだけの場合、JVMは、コードが最初にそのクラスにアクセスしようとしたときにのみそのクラスをロードします。.classバイトコードはpermスペースに入ります。
独自のクラスローダーを作成できるという意味で「制御可能」ですが、そのためにはある程度の専門知識が必要です。