Java堆空间(Java.lang.OutOfMemoryError)
在我的项目中,我有一个模块可以上传多个图像,并立即为其创建缩略图。对于上传,我使用JavaFX;对于创建缩略图,我使用Java 我在for循环中编写了上传代码和缩略图创建函数的调用。如果上载图像的数量超过五个,我将收到以下错误: Java heap space (java.lang.OutOfMemoryError)Java堆空间(Java.lang.OutOfMemoryError),java,heap,javafx,Java,Heap,Javafx,在我的项目中,我有一个模块可以上传多个图像,并立即为其创建缩略图。对于上传,我使用JavaFX;对于创建缩略图,我使用Java 我在for循环中编写了上传代码和缩略图创建函数的调用。如果上载图像的数量超过五个,我将收到以下错误: Java heap space (java.lang.OutOfMemoryError) 只要有对这些图像的引用(在变量或内部列表或其他内容中),Java的自动垃圾收集器就不会清理它。您应该只在需要时加载它们,然后在处理完每个图像后立即将变量设置为null 图像非常大,
只要有对这些图像的引用(在变量或内部列表或其他内容中),Java的自动垃圾收集器就不会清理它。您应该只在需要时加载它们,然后在处理完每个图像后立即将变量设置为null 图像非常大,Java可能会将它们解压为位图(如bmp文件,巨大),所以这并不奇怪 垃圾收集不是经常运行的(它每隔一段时间就会清理一次),所以如果您想让它现在运行(您不能强制它),您可以调用System.gc();。但垃圾收集速度很慢,因此可能会减慢处理速度 如果需要的话,你可以增加你的最大内存,但最好的做法是这样做
有了更多信息,我可以提供更详细的答案。您可以尝试使用内存分析器查看代码/类/方法的哪个部分占用了更多内存。您可以从免费开始,也可以从JDK附带的免费开始 其他著名的探查器包括: ->
->其中有递归调用吗?让我们看一些代码。您是否正在释放图像之后使用的内存?Java能做到这一点吗?你在使用什么技术?框架?不要接受异常!当它们发生时,您需要这些信息。@Rafe Ketterr:当对象不再被引用时,内存会被释放(或者更可能被重复使用)。非常感谢您的回答,您编写的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) { }
}