簡體   English   中英

當我加載大約40mb大小的11k圖像時,為什么會出現java堆空間異常

[英]Why do I get a java heap space exception when I load around 11k images with a size of around 40mb

我的程序中有一種情況,我需要訪問保存在硬盤上的一定數量的圖像。 我可以只在我真正需要它們時加載它們,或者在啟動時加載它們。

出於好奇,我試圖從幾個文件夾中讀取所有(大約11k)圖像,並將它們保存在多個列表中。 我想知道這是否需要太長時間,但在閱讀約9k圖像后收到OutOfMemoryError。

我的JRE的堆大小為1g(-Xmx1g)。

為什么我的代碼會發生這種情況? 我是否會產生內存泄漏? 你有什么建議可以改變,因為沒有經歷過這個或者解決方案只是為了只閱讀文件,一旦我需要它們? 所有文件的整體大小只有40mb左右,所以我認為將它保存在我的內存中是可以的(40mb似乎與我的1g堆大小不太一樣)。 或者java執行一些瘋狂的魔法東西,一旦加載文件大小乘以高數字?

我已經對stackoverflow做了一些研究,但是對於我的情況,無法真正轉換給定的答案(比如從這里這里 )。 所以,如果你們中有人有想法,我會非常高興:)

我的代碼在這里,對不起,如果它有點難看 - 我只是搞亂了:

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

public class FatfontsManager {

    private List<BufferedImage> until9;
    private List<BufferedImage> until99;
    private List<BufferedImage> until999;
    private List<BufferedImage> until9999;

    // loads and keeps all images 

    public FatfontsManager() {

        until9 = new ArrayList<>();
        until99 = new ArrayList<>();
        until999 = new ArrayList<>();
        until9999 = new ArrayList<>();

        String absolutPathToThisProject = new java.io.File("")
                .getAbsolutePath();

        // load Images
        for (int i = 1; i < 10; i++) {
            until9.add(loadImage(absolutPathToThisProject
                    + "\\latexDir\\0..9\\" + i + ".png"));
        }
        System.out.println("1 - 9 loaded");
        for (int i = 1; i < 100; i++) {
            until99.add(loadImage(absolutPathToThisProject
                    + "\\latexDir\\0..99\\" + i + ".png"));
        }
        System.out.println("1 - 99 loaded");
        for (int i = 1; i < 1000; i++) {
            until999.add(loadImage(absolutPathToThisProject
                    + "\\latexDir\\0..999\\" + i + ".png"));
        }
        System.out.println("1 - 999 loaded");
        for (int i = 1; i < 10000; i++) {
            until9999.add(loadImage(absolutPathToThisProject
                    + "\\latexDir\\0..9999\\" + i + ".png"));
        }
        System.out.println("1 - 9999 loaded");
    }

    public static void main(String[] args) {
        new FatfontsManager();
    }

    public static BufferedImage loadImage(String ref) {
        BufferedImage bimg = null;
        try {

            bimg = ImageIO.read(new File(ref));
        } catch (Exception e) {
            System.err.println("Error loading image file " + ref);
            e.printStackTrace();
        }
        return bimg;
    }

}

非常感謝每一個答案。

所有文件的總體大小只有40mb左右......

但是當您將圖像文件加載到內存中時,圖像將解壓縮並轉換為像素數組。 根據原始圖像文件格式(和壓縮參數),這可能需要一個數量級或更多的堆空間。

你想要實現的目標並不完全清楚,但也許你應該考慮只在實際使用時將這些圖像緩存在內存中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM