BufferedImage leaks - are there any alternatives?

2019-04-14 03:10发布

问题:

I am having strange problems with BufferedImage, which in some cases consumes all the free system memory (3GB, 1.5GB free).

I have created a simple wrapper and I use it like this:

public ImageWrapper(final byte[] bytes) throws ImageWrapperException {
    this(new ByteArrayInputStream(bytes));
}



public ImageWrapper(final ByteArrayInputStream bis) throws ImageWrapperException {
    try {
        image = ImageIO.read(bis);
        bis.close();
    } catch (IOException e) {
        throw new ImageWrapperException(e);
    }
}

(I have jsut verified that it happens even with image = ImageIO.read(file);)

I am not getting any exceptions until the first "Cannot allocate memory".

For some reason, when reading specific type of images, the reading of the image will end up with all the system memory consumed. I am not talking about heap, but really the system memory.

It happens only in certain environments - it does not happen on my OSX, but it happens on my Debian server.

  1. Do you have an idea why this could be happening?
  2. Are there any alternatives to BufferedImage, possibly working better?
  3. The problematic machine is a Virtual Server. Can it be caused by its configuration?

Thanks

EDIT:

  1. Example image: http://cl.ly/1P430l0V1g133r0C291J
  2. It is just the first and only instance which will produce this.
  3. I have just verified that it also happens with: image = ImageIO.read(file); - I am starting to think, that it must be something outside of Java - some native library which is buggy...

EDIT2:

So the problem is with the FileSystem - where I have a 7GB directory with thousands of images inside. When I try to read a file, it consumes all the memory - I suppose it is some kind of Filesystem issue.

回答1:

There are some known bugs related to ImageIO.read() and BufferedImage

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7166379

http://bugs.sun.com/view_bug.do?bug_id=6716560



回答2:

There is definitely something wrong with BufferedImage - I've tested it on two servers and it was leaking with the same results - System completely out of memory.

In the end I've written a simple wrapper over PHP and I now use GD for image manipulation. Works fine now. Thanks for all the suggestions!



回答3:

Try moving the code to java.nio and memory mapped file access. Those are stored outside the heap.

This SO is interesting.