Пространство кучи Java (java.lang.OutOfMemoryError) - PullRequest
2 голосов
/ 25 февраля 2011

В моем проекте у меня есть модуль для загрузки нескольких изображений и создания эскизов для него одновременно. Для загрузки я использую JavaFX, а для создания миниатюр я использую Java.

Я написал код загрузки и вызов функции создания эскиза внутри цикла for. Если количество загружаемых изображений превышает пять, я получаю эту ошибку:

Java heap space (java.lang.OutOfMemoryError)

Я думаю, код для загрузки в порядке, и проблема с кодом создания миниатюр. Как я могу решить эту проблему? Как я должен изменить структуру моего кода?

Это мой код JavaFX:

fgUrl = fc.getSelectedFiles();
for(fg in fgUrl) {
    try {
        System.gc();
        fileURL = "file:///{fg.toString()}";
        fileURL = fileURL.replace("\\", "/");
        def dt = DateTime{}.instant;
        var datetime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS").format(dt);
        pic_url = datetime.replace("-", "_").replace(":", "_").replace(" ", "_");
        datetime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(dt);
        f = new File("C:\\uploaded\\{pic_url}.jpg");
        uploadFile(fileURL, f,save_index,datetime,pic_url); // This function will save selected image in the working directory of the system.
        var resize_ob = new resizeImage(url.replace("file:///", ""),"C:/thumbnails/{pic_url2}.jpg");// This will call the java thumbnail creation function.
        save_index++;
    }
    catch(e:Exception) { }
}

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Вы можете попробовать использовать профилировщики памяти, чтобы увидеть, какая часть кода / класса / метода потребляет больше памяти. Вы можете начать с бесплатной JVisualVM или JConsole , которая поставляется с JDK.

Другие известные профилировщики:

-> Оптимизация ИТ

-> JProfiler

2 голосов
/ 25 февраля 2011

Пока у вас есть ссылка на эти изображения (в переменной или внутри List или чего-то еще), автоматический сборщик мусора Java не будет его очищать.Вы должны загружать их только тогда, когда они вам нужны, а затем устанавливать переменные в null, как только вы закончите работу с каждым изображением.

Изображения довольно большие, и Java, вероятно, распаковывает их в растровые изображения (например, файлы bmp,огромное), так что это не удивительно.

Сборка мусора не запускается постоянно (он часто очищается), поэтому, если вы хотите попросить его запустить сейчас (вы не можете заставить его), выможно вызвать System.gc () ;.Сборка мусора идет медленно, поэтому может замедлить вашу обработку.

При необходимости вы можете увеличить свою максимальную память, но лучше выполнить вышеуказанное.

С более подробной информацией я могу предоставить более подробный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...