Java堆空间(java.lang.OutOfMemoryError)

时间:2011-02-25 05:33:16

标签: java heap javafx

在我的项目中,我有一个模块可以上传多个图像并立即为它创建缩略图。对于上传,我使用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 个答案:

答案 0 :(得分:3)

您可以尝试使用内存分析器来查看代码/类/方法的哪个部分消耗更多内存。您可以从JDK附带的免费JVisualVMJConsole开始。

其他众所周知的分析师是:

- > Optimize IT

- > JProfiler

答案 1 :(得分:2)

只要你有这些图像的引用(在变量或List里面或其他东西),Java的自动垃圾收集器就不会清理它。您只应在需要时加载它们,然后在完成每个图像后立即将变量设置为null。

图像非常大,Java可能会将它们解压缩到位图(比如bmp文件,很大),所以这并不奇怪。

垃圾收集不会经常运行(它经常清理),所以如果你想让它现在运行(你不能强制它),你可以调用System.gc();.但垃圾收集速度很慢,因此可能会降低处理速度。

如果需要,你可以增加你的最大记忆力,但更好的做法是做到这一点。

有了更多信息,我可以提供更详细的答案。