我应该在Java程序中使用多少内存?

时间:2017-08-13 16:26:05

标签: java image memory

我正在制作一个Java程序。 它涉及制作尺寸高达9933 * 14043像素(A0尺寸和300 ppi)的图像。图像为24位,因此占用大约400mb的空间。 BufferedImage类有些如何占用比位图实际大小更多的RAM,因此图像将占用大约600 MB的RAM。 使用其他数据时,应用程序在渲染大图像时最多会占用大约700 mb的RAM。到目前为止我没有任何问题。但是,如果最终用户没有足够的可用内存,则JVM将无法为位图分配内存并将抛出OutOfMemoryError。

那我该怎么办?

我想出了一些东西:

  1. 抓住错误并向用户抛出提示。
  2. 等一段时间,直到这里有足够的记忆力。如果等待的时间太长,请提示。
  3. 编写我自己的位图类,并使用FileOutputStream按部分编写图像。 .bmp格式并不十分复杂。 (实际上我已经编写并优化了大部分内容。)通过部分渲染位图,整个图像不必保留在RAM中。可以根据可用的内存大小动态更改部件的大小。然而,这有点重新发明轮子并需要大量的工作。此外,涉及文本的图像部分必须放入BufferedImage,然后转换为我的类(因为我不想查看真正的字体格式)。无论如何,如果Java BufferedImage类在我的情况下工作,我不会这样做。

1 个答案:

答案 0 :(得分:3)

我怀疑现在任何人都不到一场公羊。因此,您可以检查用户是否有足够的内存Runtime.getRuntime().maxMemory(),以及他们是否只显示错误并关闭。以下是在出现错误时使用JOptionPane的示例:

long memory = Runtime.getRuntime().maxMemory(); //in bytes
long required = 700 * 1024 * 1024; //700MB, in bytes
if(memory < required) {
    JOptionPane.showMessageDialog(null, "You don't have enough memory. (700MB required)", "Error", JOptionPane.ERROR_MESSAGE);
    System.exit(0);
}

maxMemory()返回JVM尝试使用的最大内存量(以字节为单位)。