解决方案 »

  1.   

    这很正常,虚拟机的内存不是说一上来就给你分多少,然后就不变了。是会根据程序的需要变化的。
    你可以run.totalMemory();看看总内存肯定也是在变化的啊。
      

  2.   

    请问我测试了下,打印结果如下 ,为什么会totalMemory会变大呢?
    Runtime run = Runtime.getRuntime();
    System.out.println("内存总数" + run.totalMemory());
    System.out.println("1.空闲的内存空间" + run.freeMemory());

    StringBuffer buf = new StringBuffer("");
    for (int i = 0; i < 5000000; i++) {
    buf = buf.append(i);
    }
    System.out.println("2.空闲的内存空间" + run.freeMemory());
    run.gc();
    System.out.println("3.空闲的内存空间" + run.freeMemory());
    System.out.println("内存总数" + run.totalMemory());内存总数55115776
    1.空闲的内存空间54538864
    2.空闲的内存空间17068416
    3.空闲的内存空间168129552
    内存总数168493056
      

  3.   

    total 是 JVM 申请来的,free 当然就是还没用掉的。不要把 total 当成你的电脑的所有内存就是了。
      

  4.   

    通过Runtime获取的totalMemory和freeMemory获取的内存量和空闲内存量不是指操作系统管理的内存,而是虚拟机管理的内存。
    虚拟机说白了也就是操作系统的一个进程而已,你通过任务查看器看看进程,有哪个进程的内存是一直不变化的啊?
      

  5.   


    谢谢,但是我的意思是为什么之前的空闲内存是1.空闲的内存空间15437152,
    按到道理应该是执行了那个for循环之后,空闲的内存应该变小啊,但是为什么还会比之前的空闲的内存小呢?
    当我把for循环的次数变小的时候,是执行for循环之后的内存变小的,可是我慢慢的把执行的次数变大的时候,就出现了这个问题
      

  6.   


    谢谢,但是我的意思是为什么之前的空闲内存是1.空闲的内存空间15437152,
    按到道理应该是执行了那个for循环之后,空闲的内存应该变小啊,但是为什么还会比之前的空闲的内存小呢?
    当我把for循环的次数变小的时候,是执行for循环之后的内存变小的,可是我慢慢的把执行的次数变大的时候,就出现了这个问题唉,我发现我都白说了。例如:你的虚拟机一启动向操作系统申请了64M内存,程序用了30M,那么这时候就还剩余34M,接着又用了2M,那么剩余32M,当剩余的内存很少的时候,例如已经用了60M了,只剩下4M内存,JVM就觉得内存不够用了。再次向操作系统申请内存,这次申请了128M,那这时候剩余132M,岂不是变大了吗?