Skip to content

Memory Leak using Thumbnails.of(file).size(getWidth(),getHeight()).asBufferedImage(); #44

@GoogleCodeExporter

Description

@GoogleCodeExporter
What steps will reproduce the problem?
1.  Repeatedly generate thumbnails using code like: 
Thumbnails.of(file).size(getWidth(),getHeight()).asBufferedImage();

What is the expected output? What do you see instead?
If you watch the heap it grows very quickly, by several to tens of megabytes 
each time a thumbnail is generated.

What version of the product are you using? On what operating system? Which
version of Java (Sun/Oracle? OpenJDK?) ?
Netbeans 7.3 on OS X.

Please provide any additional information below.
Here is a simple program (testimage.jpg is a 2 MB image)
public static void main(String[] args) {
        File theFile = new File("testimage.jpg");
        BufferedImage currentThumbnail = null;

        for (int i = 0; i < 25; i++) {
            System.out.println(i+"\tCurrent Heap Size in MB: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024));
            try {
                currentThumbnail = Thumbnails.of(theFile).size(200, 200).asBufferedImage();
//                currentThumbnail = 
Thumbnailator.createThumbnail(theFile,200,200);
            } catch (Exception e) {
                System.out.println("Could not create thumbnail: " + e.toString());
            }
        }
    }

Below I show the output of the two calls to the library.  Thumbnails.of() 
continues to grow the heap and I run out of 512 MB heap after about 20 
iterations.  Thumbnailator.createThumbnail heap grows to about 125 MB max and 
then sits stable there. I feel like that's a pretty huge heap as well, but at 
least it settles down.

The Internet seems to suggest (various stackoverflow posts I have read) that 
the bufferedimages are probably being kept in a collection somewhere in the 
latter case and the references are never cleared so the images don't get 
garbage collected.  Since the Thumbnails.of approach is the one that handles 
EXIF rotation (my whole reason for using the library), this is dealbreaker for 
me right now. Thought you should know.

 Thumbnails.of output
-----------------------------------
0   Current Heap Size in MB: 1
1   Current Heap Size in MB: 55
2   Current Heap Size in MB: 76
3   Current Heap Size in MB: 122
4   Current Heap Size in MB: 152
5   Current Heap Size in MB: 142
6   Current Heap Size in MB: 194
7   Current Heap Size in MB: 230
8   Current Heap Size in MB: 240
9   Current Heap Size in MB: 240
10  Current Heap Size in MB: 286
11  Current Heap Size in MB: 286
12  Current Heap Size in MB: 332
13  Current Heap Size in MB: 378
14  Current Heap Size in MB: 355
15  Current Heap Size in MB: 400
16  Current Heap Size in MB: 400
17  Current Heap Size in MB: 423
18  Current Heap Size in MB: 446
19  Current Heap Size in MB: 458
20  Current Heap Size in MB: 481
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:59)
    at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
    at java.awt.image.Raster.createWritableRaster(Raster.java:938)
    at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056)
    at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1046)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1014)
    at javax.imageio.ImageReader.read(ImageReader.java:923)
    at net.coobird.thumbnailator.tasks.io.FileImageSource.read(Unknown Source)
    at net.coobird.thumbnailator.tasks.SourceSinkThumbnailTask.read(Unknown Source)
    at net.coobird.thumbnailator.Thumbnailator.createThumbnail(Unknown Source)
    at net.coobird.thumbnailator.Thumbnails$Builder.asBufferedImage(Unknown Source)
    at thumbtest.ThumbTest.main(ThumbTest.java:29)

Thumbnailator.createThumbnail  output
-----------------------------------
0   Current Heap Size in MB: 1
1   Current Heap Size in MB: 63
2   Current Heap Size in MB: 61
3   Current Heap Size in MB: 121
4   Current Heap Size in MB: 136
5   Current Heap Size in MB: 120
6   Current Heap Size in MB: 133
7   Current Heap Size in MB: 117
8   Current Heap Size in MB: 124
9   Current Heap Size in MB: 113
10  Current Heap Size in MB: 120
11  Current Heap Size in MB: 110
12  Current Heap Size in MB: 117
13  Current Heap Size in MB: 124
14  Current Heap Size in MB: 113
15  Current Heap Size in MB: 120
16  Current Heap Size in MB: 110
17  Current Heap Size in MB: 116
18  Current Heap Size in MB: 123
19  Current Heap Size in MB: 113
20  Current Heap Size in MB: 120
21  Current Heap Size in MB: 110
22  Current Heap Size in MB: 116
23  Current Heap Size in MB: 123
24  Current Heap Size in MB: 113

Original issue reported on code.google.com by br...@fireplan.ca on 19 May 2013 at 6:26

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions