在我的项目中,我有一个模块可以上传多个图像并立即为它创建缩略图。对于上传,我使用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) { }
}
答案 0 :(得分:3)
您可以尝试使用内存分析器来查看代码/类/方法的哪个部分消耗更多内存。您可以从JDK附带的免费JVisualVM或JConsole开始。
其他众所周知的分析师是:
- > Optimize IT
- > JProfiler
答案 1 :(得分:2)
只要你有这些图像的引用(在变量或List里面或其他东西),Java的自动垃圾收集器就不会清理它。您只应在需要时加载它们,然后在完成每个图像后立即将变量设置为null。
图像非常大,Java可能会将它们解压缩到位图(比如bmp文件,很大),所以这并不奇怪。
垃圾收集不会经常运行(它经常清理),所以如果你想让它现在运行(你不能强制它),你可以调用System.gc();.但垃圾收集速度很慢,因此可能会降低处理速度。
如果需要,你可以增加你的最大记忆力,但更好的做法是做到这一点。
有了更多信息,我可以提供更详细的答案。