不管出于什么原因,我想看看我可以创建和填充多少个对象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
,应用程序会向列表中添加一百万个Long
对象。你会认为对象越多(我们有引用,所以不能被 gc'ed),可用内存就越少。运行代码:
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()
方法是否返回了一个离我们很远的近似值?我错过了什么还是我疯了?