在 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 已经解决了这个问题。