1

有没有办法利用系统的最大内存使用strings?我runtime用来显示可用内存。我试过这段代码:

class Mem{
       public static void main(String[] args) {
              System.out.println(Runtime.getRuntime().maxMemory());
              System.out.println(Runtime.getRuntime().totalMemory());
              System.out.println(Runtime.getRuntime().freeMemory());
              String str=new String("Hi");
              for(long i=0;i<1000000;i++){
                     str+="aa";
                     //System.out.println(i);
              }      
              System.out.println(Runtime.getRuntime().freeMemory());
       }
}

但是,garbage collector每隔几次迭代就会起作用并释放内存。是否可以让它利用最大内存并在gc释放它之前显示可用内存?

4

4 回答 4

4

一种快速分配和持有大量内存的方法是

List<byte[]> bytes = new ArrayList<>();
for(int i = 0; i < 1000; i++)
    bytes.add(new byte[10000000]); // 10 MB
于 2013-01-26T11:04:15.047 回答
3

str+="aa";每次创建一个新字符串并重新分配str,以便旧字符串有资格进行垃圾回收。

但是,如果您迭代得足够多,它将在某个阶段耗尽内存。

您应该将 for 循环放在 try/catch 块中,捕获 OutOfMemoryError 并将您的 print 语句包含在 catch 块中。

于 2013-01-26T10:06:02.223 回答
3

最后,您的字符串仅包含 200 万个字符。如果你想让你的代码耗尽内存,改变

        str += "aa";

        str += str;

这将使字符串呈指数增长,即使迭代次数不多,垃圾收集也无济于事。

于 2013-01-26T10:06:41.277 回答
3

尝试类似的东西

    System.out.println(Runtime.getRuntime().maxMemory());
    System.out.println(Runtime.getRuntime().totalMemory());
    System.out.println(Runtime.getRuntime().freeMemory());
    String str = new String(new char[32_000_000]);
    System.out.println(Runtime.getRuntime().totalMemory());
    System.out.println(Runtime.getRuntime().freeMemory());

请注意,str += "aa"这太慢了,您可能会得出错误的结论。在您的情况下,GC 无法释放任何内存

于 2013-01-26T10:13:50.823 回答