One of our customers sent in a support request regarding a memory leak which was assigned to me to investigate. It actually turned out to be rather an interesting problem and provided a fix for a bug in Sun’s own code so read on for the full details and the patched jar.
To hunt down the bug, I used the excellent JProfiler to see if it would give me a clue as to what was going on. Here is a screenshot.
It turned out that the leak was actually in one of Sun’s own JAI classes, which have not seen much development in recent years. The jpeg2000 image reader seemed to be holding on to some resources even when the reference to the J2KImageReader instance had been released in our code. In the screenshot you might be able to see there is 670 odd kilobytes and just over 15 thousand instances still referenced. I looked at the reference graph in JProfilier for some of the instances and ended going round in circles!
I decided that I would have to look at the jai-imageio code to see if there was something to be done. At this point I also realised that some of our JAI links where broken and that JAI seems to be pretty much forgotten about.
After having a look at the JAI image-io code I decided to use a pretty straight forward strategy to release the memory: set some object references to null somewhere along the line! The J2KImageReader class seemed to be the place to start. While having a look I realised that the J2KImageReader class did not implement a required dispose method. When we called dispose it was just calling the super implementation of dispose in the ImageReader class. This is an empty method with a comment saying that subclasses must implement their own dispose method. I created a dispose method, nulled out J2KImageReaders private object members, rebuilt the image-io jar and ta-da!
No more memory leak! Which was pretty cool. The next part was a bit more difficult: commiting my change back to the jai-image-io repository, I faffed around for too long trying to see if this is still possible. In the end I gave up! I heard a rumour that the guy administrating the code does not work for Sun/Oracle any more, but if you have had any success comitting your changes to some of the old projects hosted on java-net then please drop me a line.
Anyway, if you are having the same problems with JAI, memory leaks and jpeg2000 I have added the image io jar rebuilt with my change to our website so you can download the jai image io jar if required.
And if you work for Oracle, can you tell me where to send the patch?
Daniel
Latest posts by Daniel (see all)
- Custom HTML Font Mapping in PDF to HTML conversion - July 30, 2011
- Turn a Jar in to a Mac app complete with Installer - June 13, 2011
- JAI Memory Leak Source Changes - April 28, 2011
- Java JAI image-io jpeg2000 Memory Leak fix - March 24, 2011
- Java images – What is happening with JAI? - March 22, 2011


You could try submitting a bug + patch to: http://java.net/jira/browse/JAI_IMAGEIO_CORE
Cheers Sean, I’ll give it a go.
It still has problems, I think in our case because our JP2s have a tile size equal to the image size and it must try to read in the entire tile even you set a small source region, and quickly runs out of (gigs of heap) memory.
java.lang.OutOfMemoryError: Java heap space
at jj2000.j2k.image.DataBlkInt.(Unknown Source)
at jj2000.j2k.wavelet.synthesis.InvWTFull.getInternCompData(Unknown Source)
at jj2000.j2k.image.ImgDataConverter.getData(Unknown Source)
at jj2000.j2k.image.ImgDataConverter.getInternCompData(Unknown Source)
at jj2000.j2k.image.invcomptransf.InvCompTransf.invRCT(Unknown Source)
at jj2000.j2k.image.invcomptransf.InvCompTransf.getInternCompData(Unknown Source)
at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.readSubsampledRaster(Unknown Source)
at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.readBufferedImage(Unknown Source)
at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReader.read(Unknown Source)
If the image is huge it will not fix that – it just frees the memory used afterwards.
What is the license for this jar? I can’t find any information.
Also, does the original jai-imageio’s license let you distribute a modified copy?
Best link we could find is http://kenai.com/projects/volumeviewer/sources/source-code-repository/content/lib/jai-imageio/LICENSE-codecLibJIIO.txt
I have emailed Oracle (we sent them the code fix) and spoke to the persion in charge at Javaone but still waiting for a response.
Hi,
Just posted a message in the “What’s happening with JAI”-thread, before I saw this post.
It seems there are several parties interested in the same thing. As I stated in my previous post, I have working code that could be used as a starting point for a replacement. If someone would join in on the effort, that would be nice too. But right now, my main concern is, can (modified portions of) the jj2000 or JAI ImageIO be redistributed under a BSD license? Don’t want to make it a wasted effort.
Thanks,
–
Harald K
It would really help if Oracle would make clear what they are up to (or if they have just abandoned it all).
For what it’s worth, I posted a follow-up in the JAI ImageIO forum on java.net too, but the “Is JAI maintained?” thread has been unanswered since June 14th…
.k
I went and asked them at Javaone. I’ll try emailing again?
Yes, please do. Thanks. I emailed admins at jai.java.net last week, but I’m not really holding my breath…
.k