我用Java编写了一个存储图片列表的程序,类似于智能手机中的图库,我最终得到OutOfMemoryError : java heap space.
这是我的代码,我得到OutOfMemoryError
...
public void showImages(){
// imageList is an array of path of pictures
for(int i=0; i<imageList.length; i++){
ImageIcon icon = new ImageIcon(imageList[i]);
JLabel label = new JLabel();
label.setIcon(icon);
panel.add(label); //problem is here
// I have made a JFrame and added a JPanel which has GridLayout
// MY Problem Is..
// When i try to add images in the panel,
// then my program show 'Out Of Memory Error : java head space'
// for each and every picture
}
}
答案 0 :(得分:2)
堆正在持有对象..这意味着你的堆满了对象
列表很长,所以你可以做两件事:
增加堆空间,有时它只是小到但这只是增加默认值的东西..你不能总是使用它
这是一个显示示例的简单链接:http://www.mkyong.com/eclipse/eclipse-java-lang-outofmemoryerror-java-heap-space/
你可以制作一些更聪明的东西,你可以做一些像延迟加载的东西......不需要一次加载大量数据......让它像分页一样,每个页面都会得到他的数据。
例如:你有1000个imagesIcons。所以你只创建了100(0-100)..当用户按下接下来你向他显示另一个100(100-200)等屏幕。这就是你应该如何处理..
但仍然将堆空间更改为更高..默认值太低
希望有所帮助
答案 1 :(得分:0)
使用VisualVM来发现内存中有多少个实例(有多少个ImageIcons,多少个JLabel等)。一旦你知道哪些实例在内存中(以及每个实例消耗了多少内存),你就可以知道问题的原因。