【问题标题】:How much memory should I use in my Java program?我应该在我的 Java 程序中使用多少内存?
【发布时间】:2017-08-13 16:26:05
【问题描述】:

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

那我该怎么办?

我想出了一个办法:

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

【问题讨论】:

  • 使用-Xmx 标志来增加内存限制有什么问题吗?
  • 从 OutOfMemoryError 中恢复是不可靠的。所以一段时间后重试可能会产生意想不到的结果。
  • 等待一段时间,我的意思是使用 Runtime.freeMemory() 方法查找空闲内存,直到可用内存量大于所需内存。
  • 700MB 也不算多,真的有问题吗?
  • 我怀疑现在任何人的内存不足。因此,您可以使用Runtime.getRuntime().maxMemory() 检查用户是否有足够的内存,以及他们是否不只是显示错误并关闭。

标签: java image memory


【解决方案1】:

我怀疑现在任何人的内存不足。因此,您可以使用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 将尝试使用的最大内存量(以字节为单位)。

【讨论】:

  • 也许我太担心了,但是如果用户同时运行一些消耗内存的程序(游戏或 Photoshop 之类的东西)怎么办?
  • 您可以使用freeMemory()反复检查空闲内存
猜你喜欢
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2010-09-10
  • 2023-04-03
相关资源
最近更新 更多