动态增加Java程序的内存

时间:2013-01-07 02:07:39

标签: java memory-management

  

可能重复:
  Setting JVM heap size at runtime

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

增加内存的原因

我正在使用java.awt.Robot谈论很多屏幕截图,过了一段时间我的Vector耗尽内存。 60 BufferedImage它出来了。
所以1280 x 800分辨率,3字节RGB BufferedImage和60张图像后,矢量出来了 所以我猜消耗的内存是
1280 x 800 x 60 x 3 = 做数学字节

3 个答案:

答案 0 :(得分:3)

好吧,你实际上无法增加堆大小,但你可以使用新的堆大小来生成另一个进程。 玩一玩:

 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);


     }  
}

答案 1 :(得分:2)

您可能需要考虑除动态更改内存大小以外的其他解决方案,包括

  • 分配合理数量的内存以开始。
  • 降低拍摄图像的分辨率(这是我通过减小图像尺寸来解决类似问题)
  • 在不需要时将图像缓存到磁盘而不是组合。

答案 2 :(得分:2)

  

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

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

而是将每张图片保存到以下任一位置:

  1. 一个Zip存档(这可以创建'1000个文件' - 这本身就有问题),没有压缩(zip压缩对图像没有任何好处)。
  2. 视频流(指向文件)。有关基于JMF的版本,请参阅Monte Media Library的Movie Maker。