在 java 中泄漏图像处理代码
leaking image processing code in java
我在 tomcat 服务器上有以下代码。目标是在 .jpg 中保存图像(以字符串形式发送)并创建等效的缩略图。
目标已正确实现,但我注意到在每次执行时(即使在尝试设置几乎所有使用的变量 "null" 之后),服务器内存都会增加 6 兆字节,而这些内存永远不会被释放。由于我有一个非常小的 RAM 服务器,这确实是个问题。顺便说一下,发送的图片只有将近 30 KB。
public boolean saveImage(String picInString)
throws IOException {
byte[] bytes = null;
try {
bytes = Base64.decode(picInString);
} catch (Base64DecodingException e) {
e.printStackTrace(System.out);
}
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
Iterator<?> readers = ImageIO.getImageReadersByFormatName("png");
ImageReader reader = (ImageReader) readers.next();
Object source = bis;
ImageInputStream iis = ImageIO.createImageInputStream(source);
Graphics2D g2 = null;
try {
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
Image image = reader.read(0, param);
// got an image file
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null),
image.getHeight(null), BufferedImage.TYPE_INT_RGB);
// bufferedImage is the RenderedImage to be written
g2 = bufferedImage.createGraphics();
g2.drawImage(image, null, null);
ImageIO.write(bufferedImage, "jpg", new File("/image.jpg"));
ImageIO.write(Scalr.resize(MyImageClass.cropImage(bufferedImage), 100, 100),
"jpg", new File("/image_mini.jpg"));
bufferedImage.flush();
bufferedImage = null;
} catch (Exception e) {
e.printStackTrace(System.out);
} finally {
if (reader != null) {
reader.dispose();
}
if (g2 != null) {
g2.dispose();
}
bis.close();
iis.close();
reader = null;
bis = null;
iis = null;
}
return false;
}
任何帮助将不胜感激!
您不应该按原样驯服图像。您应该像 android 中那样对它进行采样。缩放是防止内存错误和异常的必要条件。这个 SO 问题是您所有问题的解决方案。
How to improve the performance of g.drawImage() method for resizing images
有人给了我答案的线索,但我再也看不到评论了。
实际上,在过程结束时将变量 "image" 设置为 null 已经解决了这个问题。
我在 tomcat 服务器上有以下代码。目标是在 .jpg 中保存图像(以字符串形式发送)并创建等效的缩略图。 目标已正确实现,但我注意到在每次执行时(即使在尝试设置几乎所有使用的变量 "null" 之后),服务器内存都会增加 6 兆字节,而这些内存永远不会被释放。由于我有一个非常小的 RAM 服务器,这确实是个问题。顺便说一下,发送的图片只有将近 30 KB。
public boolean saveImage(String picInString)
throws IOException {
byte[] bytes = null;
try {
bytes = Base64.decode(picInString);
} catch (Base64DecodingException e) {
e.printStackTrace(System.out);
}
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
Iterator<?> readers = ImageIO.getImageReadersByFormatName("png");
ImageReader reader = (ImageReader) readers.next();
Object source = bis;
ImageInputStream iis = ImageIO.createImageInputStream(source);
Graphics2D g2 = null;
try {
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
Image image = reader.read(0, param);
// got an image file
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null),
image.getHeight(null), BufferedImage.TYPE_INT_RGB);
// bufferedImage is the RenderedImage to be written
g2 = bufferedImage.createGraphics();
g2.drawImage(image, null, null);
ImageIO.write(bufferedImage, "jpg", new File("/image.jpg"));
ImageIO.write(Scalr.resize(MyImageClass.cropImage(bufferedImage), 100, 100),
"jpg", new File("/image_mini.jpg"));
bufferedImage.flush();
bufferedImage = null;
} catch (Exception e) {
e.printStackTrace(System.out);
} finally {
if (reader != null) {
reader.dispose();
}
if (g2 != null) {
g2.dispose();
}
bis.close();
iis.close();
reader = null;
bis = null;
iis = null;
}
return false;
}
任何帮助将不胜感激!
您不应该按原样驯服图像。您应该像 android 中那样对它进行采样。缩放是防止内存错误和异常的必要条件。这个 SO 问题是您所有问题的解决方案。 How to improve the performance of g.drawImage() method for resizing images
有人给了我答案的线索,但我再也看不到评论了。 实际上,在过程结束时将变量 "image" 设置为 null 已经解决了这个问题。