3

可能重复:
在运行时设置 JVM 堆大小

OutOfMemoryError是否可以通过增加程序允许的内存来防止程序在遇到 a 时崩溃?
可以在运行时完成吗?

增加内存的原因

我正在谈论很多屏幕截图java.awt.Robot,但一段时间后,我的 Vector 内存不足。60岁BufferedImage 就出局了。
所以 1280 x 800 分辨率、3 字节 RGBBufferedImage和 60 张图像之后,矢量就出来了。
所以我猜消耗的内存是
1280 x 800 x 60 x 3 =做数学字节

4

4 回答 4

3

简短的回答 - 不。或者至少,不使用 Hotspot JVM。

参考:

于 2013-01-07T02:13:39.610 回答
3

Ok well you can't actually increase the heapsize, but you could spawn another process with a new heapsize. Have a play with this:

 public class SpawnAndChangeHeap {
     public static void main(String[] args){  

         //Get the jvm heap size.  
        long heapSize = Runtime.getRuntime().totalMemory();
    JOptionPane.showMessageDialog(null, "" + heapSize );  

    if(args.length > 0 && args[0].equals("-spawn")) {

        try {
            Process proc;
                proc = Runtime.getRuntime().exec("cmd.exe /c java -Xms32m -Xmx128m SpawnAndChangeHeap /n");
        }
        catch(Exception e) {System.out.println("something went wrong");  }
    }
    System.exit(0);


     }  
}
于 2013-01-07T02:16:34.970 回答
2

我正在谈论很多屏幕截图java.awt.Robot,但一段时间后我Vector的内存不足。

不要把它们放在一个Vector. 根本不需要将它们存储在内存中。

而是将每个图像保存到以下任一位置:

  1. 没有压缩的 Zip 存档(这可以创建“1000 个文件” - 这本身就是有问题的)(zip 压缩对图像没有任何好处)。
  2. 视频流(指向文件)。有关运行良好的基于​​ JMF 的版本,请参阅Monte Media Library的 Movie Maker 。
于 2013-01-07T02:31:07.537 回答
2

You may need to think of other solutions other than dynamically changing memory size including

  • allocating a reasonable amount of memory to start with.
  • decreasing the resolution of your captured images (which is what I did for a similar problem by decreasing image size)
  • caching your images to disk when not immediately needed vs. a combination.
于 2013-01-07T02:17:26.177 回答