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

Java Runtime.freeMemory()在添加更多对象时返回奇怪的结果,java,memory-management,garbage-collection,Java,Memory Management,Garbage Collection,不管出于什么原因,我想看看我可以创建多少对象并用它们填充LinkedList。我使用Runtime.getRuntime().freemory()获得JVM中可用内存的近似值。我写道: public static void main(String[] arg) { Scanner kb = new Scanner(System.in); List<Long> mem = new LinkedList<Long>(); while (true) {

不管出于什么原因,我想看看我可以创建多少对象并用它们填充
LinkedList
。我使用
Runtime.getRuntime().freemory()
获得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));
        }
    }
}

可用内存波动。这是怎么发生的?GC是否正在清理其他东西(堆上还有哪些其他东西需要真正清理?),
freemory()
方法是否返回了一个远非如此的近似值?我是错过了什么还是疯了?

当您消耗更多内存时,堆会增加。请注意,
freemory()
报告相对于当前堆大小的使用情况,当前堆大小可能会增加。选中
totalMemory()
而不是
maxMemory()
。如果我没记错的话

或者你是在问分配了哪些可能被垃圾回收的资源

  • 循环中分配的
    随机
  • 在从OS流读取、解析为字符、然后解析为行的过程中分配的对象
  • 可能在调用过程中分配了一些东西来检查空闲内存本身

好吧,您在每次迭代中都会创建一个新的随机对象。所有这些对象都必须进行GC'ed。您不必保留对
Random
objects@durron597在我看来很好Xmx,提交的内存可能正在增加。在JVM上插入JVisualVM(带有VisualGC插件)以获得更多信息。或者给我们你的JVM参数。我尝试了Random,也尝试了Long.MAX_值,我得到了类似的结果。更新为Long.MAX_值。我不知道堆的大小是可变的。所以JVM中的内存就像:
[ALL memory[][]]
?两者都可以根据需要在最大内存范围内增长?不,这是因为当堆满时,Java会从操作系统获得更多内存,以扩展JVM内存。直到Xmx限制。您可以强制它使用Xms预先获取所有这些信息。
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.