`

编写安全的代码,关于java的内存溢出的问题

    博客分类:
  • java
阅读更多

因为内存管理很重要,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代码制造一个内存溢出的情况

    主要介绍了编写Java代码制造一个内存溢出的情况,或许这种有意制造能够更好地帮助理解Java中的内存溢出情况XD 需要的朋友可以参考下

    Java开发技术大全(500个源代码).

    localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法...

    内存泄露分析工具Memory_Analyzer_Tool(MAT)介绍.docx

    此外,MAT工具还可以帮助开发者编写高效的代码,避免内存泄露问题。例如,可以使用有向图的方式进行内存管理,消除引用循环的问题。或者,可以使用计数器方式管理构件,虽然精度不高,但执行效率很高。 MAT工具是一...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-019-Java语言概述-第一个程序-代码编写.mp4 北京动力节点-Java编程零基础教程-020-Java语言概述-第一个程序-源文件的编译.mp4 北京动力节点-Java编程零基础教程-021-Java语言...

    2021Java零基础自学笔记资源(十一)方法重载

    方法重载的优点是代码美观方便代码的编写。 接下来,我们讨论方法递归的概念。方法递归是指一个方法自身调用自身。使用递归的时候,必须添加结束条件,没有结束条件,会发生栈内存溢出错误。StackOverflowError的...

    其他类别检测JSP服务器内存的Ajax程序-systemjc.rar

    同时,这种实时更新的方式也使得系统管理员能够快速响应可能出现的性能瓶颈或内存溢出问题,及时采取措施来优化服务器性能,保证服务的高可用性。此JSP源码资料包不仅为开发人员提供了一套完整的服务器内存检测解决...

    学生成绩管理分析系统 毕业设计.zip

    它不仅支持面向对象编程的所有特性,如封装、继承和多态,还具有健壮性、安全性以及平台独立性等优点,能够有效防止各种内存溢出和类型安全问题。 Java在企业级应用开发中占据主导地位,广泛应用于服务器端Web应用...

    混合音乐推荐系统-Track Stacking-毕业设计.zip

    它不仅支持面向对象编程的所有特性,如封装、继承和多态,还具有健壮性、安全性以及平台独立性等优点,能够有效防止各种内存溢出和类型安全问题。 Java在企业级应用开发中占据主导地位,广泛应用于服务器端Web应用...

    Android毕业设计; Android, Music Player, for graduation.zip

    它不仅支持面向对象编程的所有特性,如封装、继承和多态,还具有健壮性、安全性以及平台独立性等优点,能够有效防止各种内存溢出和类型安全问题。 Java在企业级应用开发中占据主导地位,广泛应用于服务器端Web应用...

    操作系统(内存管理)

    文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...

    JAVA虚拟机原理

    JavaGC(GarbageCollection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码。在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该...

    JAVA面试题最全集

    编写代码实现一个线程池 40.描述一下JVM加载class文件的原理机制? 41.试举例说明一个典型的垃圾回收算法? 42.请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 43.请写一个java...

    java 面试题 总结

    比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 ...

    J2ME内存优化

    J2ME内存优化  内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。

    超级有影响力霸气的Java面试题大全文档

    比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 19、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 ...

    Programming_In_Lua.doc(word版本,带完整文档结构图)

    而Lua并不帮你编写大量的代码的程序,相反的,Lua仅让你用少量的代码解决关键问题。为实现这个目标,像其他语言一样Lua依赖于其可扩展性。但是与其他语言不同的是,不仅用Lua编写的软件易于扩展,而且用其他语言比如...

    Android技术总结.doc

    通过创建一个Android项目,使用 Eclipse开发环境,编写Java代码和XML布局文件,实现了一个简单的 HelloWorld应用程序。 2.2 Activity和生命周期 Activity是Android应用程序的基本组件,负责与用户交互。Activity的...

    C#微软培训资料

    14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 ...

    JSTL详细标签库介绍

    <BR>3、常见异常实例包括:数组下标越界,算法溢出(超出数值表达范围),除数为零,无效参数、内存溢出异常处理功能:主要处理一些同步异常(除数为0),不宜处理一些异步事件(Disk I/O End、网络信息到达、点击...

    iOS面试题及答案

    本质上还是使用引用计数来管理对象,只是我们在编写代码时,不需要向对象发送release 或者 autorelease 方法,也不可以调用 delloc 方法,编译器会在合适的位置自动给用户生成 release(autorelease)消息。...

Global site tag (gtag.js) - Google Analytics