« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
Blog信息 |
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9674124 建立时间: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();
|
|
回复:编写安全的代码,关于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 »
|