2011-02-25 114 views
2

在我的项目中,我有一个模块可以一次性上传多个图像并为其创建缩略图。对于上传,我使用JavaFX并创建缩略图,我使用的是Java。Java堆空间(java.lang.OutOfMemoryError)

我在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

你有没有在它的递归调用?让我们看看一些代码。 – corsiKa 2011-02-25 05:38:02

+0

你是否释放了之后图像用完的内存? Java甚至可以做到这一点? – 2011-02-25 05:39:39

+0

您使用的是什么技术?构架? – Koekiebox 2011-02-25 05:40:02

回答

3

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

其他知名的廓线:

- >Optimize IT

- >JProfiler

+4

一个不错的免费启动器分析器是JDK中的jvisualvm。 – 2011-02-25 06:54:13

+0

您编写的JavaFX代码中的内存问题还是来自框架? – Ansgar 2013-02-07 09:42:00

2

只要你有这些图像(在一个变量或内部列表或某物)的Java的自动垃圾收集器不会清理的参考。您只需在需要时加载它们,然后在完成每个图像后立即将变量设置为null。

图像相当大,Java可能将它们解包为位图(如bmp文件,巨大),所以这并不意外。垃圾收集不会持续运行(每隔一段时间就会清理一次),所以如果您想让它现在运行(无法强制执行),您可以调用System.gc();.垃圾收集虽然很慢,所以可能会减慢处理速度。

如果需要,您可以增加您的最大内存,但更好的做法是做到上述。

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

+0

非常感谢您的回复, – laradev 2011-02-25 06:04:57

+0

我已将javafx代码添加到问题 – laradev 2011-02-25 06:43:55

相关问题