JAVA内存溢出解析(二)

2014-11-24 11:30:20 · 作者: · 浏览: 14
,导致该题目产生有时会在产品景象中产生, 凡是可以应用对象跟踪体系的内存应用景象,在有些个别景象下或许某个时刻确切 是应用了多量内存导致 out of memory,这时应持续跟踪看接下来是否会有降落,
若是一向居高不下这必然就因为法度的原因导致内存泄漏。
五、不结实代码的特点及解决办法
1 、尽早开释无用对象的引用。好的办法是应用姑且变量的时辰,让引用变量在退出活动域后,主动设置为 null ,暗示垃圾收集器来收集该对象,防止产生内存泄漏。
对于仍然有指针指向的实例, jvm 就不会收受接管该资料 , 因为垃圾收受接管会将值为 null 的对象作为垃圾,进步 GC 收受接管机制效力;
2 、我们的法度里不成避免多量应用字符串处理惩罚,避免应用 String ,应多量应用 StringBuffer ,每一个 String 对象都得自力占用内存一块区域;
String str = “aaa”;
String str2 = “bbb”;
String str3 = str + str2;// 假如履行此次之后 str ,str2 今后再不被调用 , 那它就会被放在内存中守候 Java 的 gc 去收受接管 , 法度内过多的呈现如许的景象就会报上方的那个错误 , 建议在应用字符串时能应用 StringBuffer 就不要用 String, 如许可以省不少开销;
3 、尽量罕用静态变量,因为静态变量是全局的, GC 不会收受接管的;
4 、避免集中创建对象尤其是大对象, JVM 会忽然须要多量内存,这时必定会触发 GC 优化体系内存景象;显示的声明数组空间,并且申请数量还极大。
这是一个案例想定供大师警惕:
应用jspsmartUpload作文件上传,如今运行过程中经常呈现java.outofMemoryError的错误,用top号令看看过程应用景象,发明内存不足2M,花了很长时候,发明是jspsmartupload的题目。把jspsmartupload组件的 源码文件(class文件)反编译成Java文件,如梦方醒:
m_totalBytes = m_request.getContentLength();
m_binArray = new byte[m_totalBytes];
变量m_totalBytes默示用户上传的文件的总长度,这是一个很大的数。若是用如许大的数去声明一个byte数组,并给数组的每个元素分派内存空间,并且m_binArray数组不克不及即速被开释,JVM的垃圾收受接管确切有题目,导致的成果就是内存溢出。
jspsmartUpload为什末要如许作,有他的原因,按照RFC1867的http上传标准,获得一个文件流,并不知道文件流的长度。设计者若是想文件的长度,只有操纵servletinputstream一次才知道,因为任何流都不知道大小。只有知道文件长度了,才可以限制用户上传文件的长度。为了省去这个麻烦,jspsmartUpload设计者直接在内存中打开文件,断定长度是否合适标准,合适就写到办事器的硬盘。如许产生内存溢出,这只是我的一个猜测罢了。
所以 编程的时辰,不要在内存中申请大的空间,因为web办事器的内存有限,并且尽可能的应用流操纵,例如
  byte[] mFileBody = new byte[512];
Blob vField= rs.getBlob("FileBody");
InputStream instream=vField.getBinaryStream();
FileOutputStream fos=new FileOutputStream(saveFilePath+CFILENAME);
int b;
while( (b =instream.read(mFileBody)) != -1){
fos.write(mFileBody,0,b);
}
fos.close();
instream.close();
JAVA不推荐用String 获取大量信息,造成内存溢出就是它!
public String getClobString(ResultSet rs, String colName) {
try {
Reader reader = rs.getCharacterStream(colName);
if (reader == null) {
return null;
}
StringBuffer sb = new StringBuffer();
char[] charbuf = new char[4096];
for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {
sb.append(charbuf, 0, i);
}
return sb.toString();
} catch (Exception e) {
return "";
}
} www.2cto.com
5 、尽量应用对象池技巧以进步体系机能;生命周期长的对象拥有生命周期短的对象时轻易激发内存泄漏,例如大凑集对象拥有大数据量的营业对象的时辰,可以推敲分块进行处理惩罚,然后解决一块开释一块的策略。
6 、不要在经常调用的办法中创建对象,尤其是忌讳在轮回中创建对象。可以恰当的应用 hashtable , vector 创建一组对象容器,然后安闲器中去取那些对象,而不消每次 new 之后又丢弃
7 、一般都是产生在开启大型文件或跟 数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就可能要策画一下数据量的最大值是几许,并且设定所需最小及最大的内存空间值。