なんらかの理由で、作成してデータを入力できるオブジェクトの数を確認したかったのLinkedList
です。以前Runtime.getRuntime().freeMemory()
は、JVMの空きメモリの概算を取得していました。私はこれを書いた:
public static void main(String[] arg) {
Scanner kb = new Scanner(System.in);
List<Long> mem = new LinkedList<Long>();
while (true) {
System.out.println("Max memory: " + Runtime.getRuntime().maxMemory() + ". Available memory: " + Runtime.getRuntime().freeMemory() + " bytes. Press enter to use more.");
String s = kb.nextLine();
if (s.equals("m"))
for (int i = 0; i < 1000000; i++) {
mem.add(new Long(Long.MAX_VALUE));
}
}
}
を書き込むとm
、アプリはリストに100万Long
個のオブジェクトを追加します。オブジェクトが多いほど(参照があるため、gcすることはできません)、空きメモリが少なくなると思います。コードの実行:
Max memory: 1897725952. Available memory: 127257696 bytes.
m
Max memory: 1897725952. Available memory: 108426520 bytes.
m
Max memory: 1897725952. Available memory: 139873296 bytes.
m
Max memory: 1897725952. Available memory: 210632232 bytes.
m
Max memory: 1897725952. Available memory: 137268792 bytes.
m
Max memory: 1897725952. Available memory: 239504784 bytes.
m
Max memory: 1897725952. Available memory: 169507792 bytes.
m
Max memory: 1897725952. Available memory: 259686128 bytes.
m
Max memory: 1897725952. Available memory: 189293488 bytes.
m
Max memory: 1897725952. Available memory: 387686544 bytes.
使用可能なメモリが変動します。これはどのように起こりますか?GCは他のものをクリーンアップしていますか(実際にクリーンアップするためにヒープ上に他にどのようなものがありますか?)、freeMemory()
メソッドはかなり離れた近似を返しますか?私は何かが足りないのですか、それとも夢中ですか?