本站首页    管理页面    写新日志    退出


«October 2018»
123456
78910111213
14151617181920
21222324252627
28293031


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9097508
建立时间:2004年12月20日




[java语言]编写安全的代码,关于java的内存溢出的问题
原创空间

邢红瑞 发表于 2005-3-16 14:43:51

因为内存管理很重要,c++的设计者把它交给程序员管理。因为内存管理很重要,java的设计者把它交给系统管理。内存泄漏是C++的通病,内存溢出是java的硬伤。 很久以前,使用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();                 


阅读全文(35829) | 回复(6) | 编辑 | 精华
 


回复:编写安全的代码,关于java的内存溢出的问题
原创空间

祝福(游客)发表评论于2012-6-19 15:05:00

以下引用候鸟(游客)在2010-2-22 14:08:50的评论: 嗯 不过 建议不要把byte[] mFileBody = new byte[512];new出来的字节太大 这样容易造成椎栈异常 例如byte[] mFileBody = new byte[20480];怎么看你这句话都看不懂


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:编写安全的代码,关于java的内存溢出的问题
原创空间

hihi(游客)发表评论于2010-10-14 17:29:25

java的new是在堆中申请内存,所以2万多长的数组不会出问题的,放心吧

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:编写安全的代码,关于java的内存溢出的问题
原创空间

候鸟(游客)发表评论于2010-2-22 14:08:50

嗯 不过 建议不要把byte[] mFileBody = new byte[512];new出来的字节太大 这样容易造成椎栈异常 例如byte[] mFileBody = new byte[20480];

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:编写安全的代码,关于java的内存溢出的问题
原创空间

lv_2005_wy(游客)发表评论于2007-8-3 11:20:28

有点意思

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:编写安全的代码,关于java的内存溢出的问题
原创空间

flex(游客)发表评论于2005-3-17 13:31:52

很有深度  

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144152859 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号