首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

java.lang.OutOfMemoryError: Java heap space,该怎么处理

2013-04-27 
java.lang.OutOfMemoryError: Java heap space手里有些图片,几万张,想要对这些图片生成预览图,但是总是报

java.lang.OutOfMemoryError: Java heap space
手里有些图片,几万张,想要对这些图片生成预览图,但是总是报错,麻烦各位大大帮我看下我代码里面问题出在何处,谢谢了!


package liuc.test;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;


import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;


/**
 * @author Liuc
 * @date 2013-4-17
 */
public class CreateBrevImg {
public static void main(String[] args)  {
String filePath = "C:\\Users\\Administrator\\Desktop\\testP";
String brevFilePath = "C:\\Users\\Administrator\\Desktop\\Brev";
CreateBrevImg c = new CreateBrevImg();
c.getBrev(filePath, brevFilePath);
}


public void getBrev(String filePath, String brevFilePath){
File file = new File(filePath);
File[] files = file.listFiles();
InputStream is = null ;
String tmpBrevPicPath = "";
File tmpFile;
int i = 0;
int new_w=150;
int new_h=100; 
Image src;
BufferedImage tag;
FileOutputStream newimage;
JPEGImageEncoder encoder;
try {
for (File file2 : files) {
if("Brev".equals(file2.getName())){
continue;
}
//System.out.println(file2.getAbsolutePath());
tmpBrevPicPath = brevFilePath + "\" + file2.getName();
if(file2.getName().indexOf('.')==-1){
continue;
}
tmpFile = file2;
is = new FileInputStream(tmpFile);
//ImgUtil.brvePic(tmpBrevPicPath, is);

src = javax.imageio.ImageIO.read(is);                     
    tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
    tag.getGraphics().drawImage(src,0,0,new_w,new_h,null);      
    newimage=new FileOutputStream(tmpBrevPicPath);          
    encoder = JPEGCodec.createJPEGEncoder(newimage);       
    encoder.encode(tag);                                               
    newimage.close();
i++;
}
} catch (Exception e) {
e.printStackTrace();
} finally{
System.out.println("已转换" + i + "张图片");
is = null ;
files = null;
file = null;
src = null;
tag = null;
newimage = null;
tmpFile = null;
encoder = null;
}

}
}

内存溢出
[解决办法]
for循环一次就关闭流,因为你每次for循环进去后是重新打开流的,或者中间flush以下。
------解决方案--------------------


内存溢出  建议一张张测试一下
[解决办法]
你的newimage都知道在循环里面close()。
为啥你的is和tag不调用close()呢
[解决办法]
我做过读取几十个文本文件,每个文件从几十M到几百M不等,如果单个文件会引起内存溢出就要定期处理一次,而你的文件最大为:30M,应没问题,只是你应该在每个for循环后关闭流,我看到你并未没关闭输入流,你也可以在catch中打印下该文件的信息及总共读取了多少M的文件了,以作定位之用,希望能帮到你。
[解决办法]
建议分几次转

热点排行