Java Runtime.freeMemory()在添加更多对象时返回奇怪的结果

时间:2012-12-12 22:33:21

标签: java memory-management garbage-collection

无论出于何种原因,我想看看我可以创建多少个对象并填充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()方法是否返回了近似值?我错过了什么,还是我疯了?

1 个答案:

答案 0 :(得分:1)

当您消耗更多内存时,堆会增长。请注意,freeMemory()报告相对于当前堆大小的使用情况,该大小可能会增长。检查totalMemory()而不是maxMemory()。如果我回想起这个话。

或者你在问可能被垃圾收集的是什么?

  • 您在循环中分配的Random
  • 在从OS流读取过程中分配的对象,解析为字符,然后解析为行
  • 可能会在通话过程中分配一些东西来检查空闲内存本身