java内存溢出Exception in thread "Thread-0"java.lang.OutOfMemoryError:Java heap space 10
我做一个网页静态化的程序,用一个线程以URL方式读取一个地址,如果里面还有链接地址就再往里面读,一层层递归,把网页写到不同的html文件中,html文件名为当前时间,用个...
我做一个网页静态化的程序,用一个线程以URL方式读取一个地址,如果里面还有链接地址就再往里面读,一层层递归,把网页写到不同的html文件中,html文件名为当前时间,用个HashMap保存 <url,fileName>,增加判断保证每个地址只读写一次。循环代码如下:
//url:连接地址,path:保存文件名
public void down(String realmName,URL url,String charsetName,Map<String,String> urlMap,Map <String,String>fileMap,File filePlace,String fileName){
URLConnection conn=null;
InputStream is=null;
BufferedReader br=null;
BufferedWriter bw=null;
try {
conn = url.openConnection();
is=conn.getInputStream();
br=new BufferedReader(new InputStreamReader(is,charsetName));
if(!filePlace.exists()){
filePlace.mkdirs();
}
bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePlace.getPath()+File.separator+fileName)));
String msg=br.readLine();
while(msg!=null){
String ss=msg;
if(hasATag(ss)){ //判断有没有<a href='xxxx'>的地址
ss=ss.replaceAll("\\s+"," ");
ss=cutOutString(ss);
if(ss.indexOf("javascript")==-1){
String fileName2=new Date().getTime()+".html";
URL urlpath=null;
if(ss.startsWith("/")){
urlpath=new URL(realmName+ss);
}else{
urlpath=new URL(realmName+"/"+ss);
}
if(!fileMap.containsKey(urlpath.toString())){
msg=msg.replace(ss, fileName2);
fileMap.put(urlpath.toString(),fileName2);
}else{
msg=msg.replace(ss, fileMap.get(urlpath.toString()));
}
System.out.println(msg);
//System.out.println(fileMap);
if(!urlMap.containsKey(urlpath.toString())){
urlMap.put(url.toString(),filePlace.getPath()+File.separator+fileName);
filePlace=new File(filePlace.getPath()+File.separator);
System.out.println("-----------------");
down(realmName,urlpath,"utf-8",urlMap,fileMap,filePlace,fileName2);
}
}
}
bw.write(msg);
bw.newLine();
bw.flush();
msg=br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(bw!=null){
bw.flush();
bw.close();
}
if(br!=null){
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
读a 地址写出了5000多个html没报任何错误,读b地址写出1200多个的时候就报错,而且每次都报错,我的eclipse内存配置如下-vmargs -Xms64M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=512M
我试着增加内存到1024M 结果还是一样报错。纠结了好久了,不知道怎么解决,希望各位帮小弟指点指点,谢谢!
如果需要我可以把全部代码贴出来。 展开
//url:连接地址,path:保存文件名
public void down(String realmName,URL url,String charsetName,Map<String,String> urlMap,Map <String,String>fileMap,File filePlace,String fileName){
URLConnection conn=null;
InputStream is=null;
BufferedReader br=null;
BufferedWriter bw=null;
try {
conn = url.openConnection();
is=conn.getInputStream();
br=new BufferedReader(new InputStreamReader(is,charsetName));
if(!filePlace.exists()){
filePlace.mkdirs();
}
bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePlace.getPath()+File.separator+fileName)));
String msg=br.readLine();
while(msg!=null){
String ss=msg;
if(hasATag(ss)){ //判断有没有<a href='xxxx'>的地址
ss=ss.replaceAll("\\s+"," ");
ss=cutOutString(ss);
if(ss.indexOf("javascript")==-1){
String fileName2=new Date().getTime()+".html";
URL urlpath=null;
if(ss.startsWith("/")){
urlpath=new URL(realmName+ss);
}else{
urlpath=new URL(realmName+"/"+ss);
}
if(!fileMap.containsKey(urlpath.toString())){
msg=msg.replace(ss, fileName2);
fileMap.put(urlpath.toString(),fileName2);
}else{
msg=msg.replace(ss, fileMap.get(urlpath.toString()));
}
System.out.println(msg);
//System.out.println(fileMap);
if(!urlMap.containsKey(urlpath.toString())){
urlMap.put(url.toString(),filePlace.getPath()+File.separator+fileName);
filePlace=new File(filePlace.getPath()+File.separator);
System.out.println("-----------------");
down(realmName,urlpath,"utf-8",urlMap,fileMap,filePlace,fileName2);
}
}
}
bw.write(msg);
bw.newLine();
bw.flush();
msg=br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(bw!=null){
bw.flush();
bw.close();
}
if(br!=null){
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
读a 地址写出了5000多个html没报任何错误,读b地址写出1200多个的时候就报错,而且每次都报错,我的eclipse内存配置如下-vmargs -Xms64M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=512M
我试着增加内存到1024M 结果还是一样报错。纠结了好久了,不知道怎么解决,希望各位帮小弟指点指点,谢谢!
如果需要我可以把全部代码贴出来。 展开
2个回答
展开全部
手动设置MaxPermSize大小,如果是linux系统,修改TOMCAT_HOME/bin/catalina.sh,如果是windows系统,修改TOMCAT_HOME/bin/
catalina.bat,
4
在“echo "Using CATALINA_BASE: $CATALINA_BASE"
”上面加入以下行:
5
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
6
7
////////////////////////////////////////////////////////////////////////
/
8
9
解决方法2:
10
修改eclipse.ini文件,修改如下:
11
12
-
vmargs
13
-Dosgi.requiredJavaVersion=1.5
14
-
Xms128m
15
-
Xmx512m
16
-XX:PermSize=
64M
17
-XX:MaxPermSize=
128M
18
19
如果还报错,可以考虑如下修改
20
21
-
vmargs
22
-Dosgi.requiredJavaVersion=1.5
23
-
Xms512m
24
-
Xmx1024m
25
-XX:PermSize=
256M
26
-XX:MaxPermSize=512M
展开全部
你分析下你的代码是不是哪个地方有的连接或流什么的没有及时关闭。还有就是里边执行时进入了死循环。。
更多追问追答
追问
我是读到一个地址就往这个地址进去再读里面的内容,如果再碰到地址就再往里面读,一层层递归。感觉没什么问题,有个地址我全部写完了,5000多个静态文件,另一个地址写了不到2000就报错了,好纠结的。
追答
是不是你的其他以后的网页里边又调用之前的已经读取过的地址了。这样就死了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询