`

编写安全的代码,关于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();

                

分享到:
评论

相关推荐

    JVM内存溢出问题解析

    JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...

    关于static的小结(Java内存溢出)

    ### 关于static的小结(Java内存溢出) #### 标题和描述中的知识点 在《关于static的小结(Java内存溢出)》这篇文章中,作者主要探讨了与Java中的`static`关键字相关的知识点,以及如何可能导致内存溢出的情况。...

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

    解决jetty8内存溢出版本

    综上所述,解决Jetty 8内存溢出问题需要综合考虑JVM参数配置、代码优化、资源管理策略以及监控与分析等多个层面。通过对上述知识点的理解和实践,可以有效地预防和解决Jetty 8的内存溢出问题,提高服务的稳定性和...

    编写Java代码制造一个内存溢出的情况

    本文将深入探讨如何通过Java代码故意制造内存溢出的情况,以帮助理解这个问题的本质。 首先,我们来看一个关于HashSet/HashMap的示例。在Java中,当使用这些数据结构时,键对象必须正确地实现`equals()`和`hashCode...

    解决Java导入excel大量数据出现内存溢出的问题

    使用CSV文件可以解决Java导入excel大量数据出现内存溢出的问题,但是需要将Excel文件转换为CSV文件,并编写代码来读取和处理CSV文件。 知识点: * Java中的内存溢出问题 * POI库的使用 * CSV文件的读取和处理 * ...

    eclispe启动内存溢出问题

    ### Eclipse启动内存溢出问题详解 #### 一、问题背景 Eclipse是一款广泛使用的开源集成开发环境(IDE),适用于多种编程语言,如Java、C/C++等。在使用Eclipse进行软件开发过程中,可能会遇到“内存溢出”(Out of...

    Java加载dll,导致Java进程内存泄露

    在Java中,通过Java Native Interface (JNI) 可以调用C/C++编写的动态链接库(DLL),实现Java代码与本地代码的交互。然而,这种跨语言的交互可能会带来一些特殊的问题,其中之一就是内存泄露。 Java本身具有垃圾...

    从 Java 代码到 Java 堆 理解和优化您的应用程序的内存使用

    5. **内存溢出问题**: - **堆溢出**:当Java堆不足以分配新的对象时,会发生`OutOfMemoryError`。通过增加堆大小或优化对象使用可以解决这个问题。 - **栈溢出**:过深的递归或过多的本地变量也可能导致栈溢出。...

    android 显示大的gif图片 能解决内存溢出的问题

    在Android平台上,显示大型GIF图像可能会导致内存溢出(Memory Overflow)问题,因为GIF是一种动画格式,它包含多帧连续的图像,如果直接加载到内存中,会占用大量资源。为了解决这个问题,我们可以采用一些技术策略...

    内存溢出

    总的来说,防止内存溢出需要从编写高效、无泄漏的代码,选择合适的工具进行监控和分析,以及适时调整系统配置等多个方面综合考虑。理解内存管理的基本原理,并结合实际工具进行实践,是每个IT专业人员必备的技能。

    防止内存溢出_jar文件_

    总结,防止Java应用程序内存溢出,关键在于理解JVM内存结构,合理配置内存参数,选择合适的垃圾收集策略,以及编写高效、无泄漏的代码。对于《我的世界》这样的大型应用,还需要考虑游戏特性和用户环境,进行针对性...

    Eclipse内存溢出

    ### Eclipse内存溢出问题解析与解决方案 #### 一、内存溢出概述 内存溢出(Memory Leak)是指程序运行过程中使用的内存超过系统所能提供的最大内存限制时所出现的问题。这种情况通常发生在Java等需要进行垃圾回收...

    java内存泄漏与内存溢出关系解析

    "java内存泄漏与内存溢出关系解析" java内存泄漏与内存溢出关系解析是java开发者需要了解的重要知识点之一。下面我们将详细介绍java内存泄漏与内存溢出的关系、原因和解决方法。 一、内存泄漏和内存溢出的定义 ...

    Java内存溢出及分析

    Java内存溢出问题,是Java开发中常见的性能问题之一,主要由于程序运行过程中对内存的不合理使用导致。Java与C/C++不同,它的垃圾回收机制虽然可以自动清理不再使用的对象,但并不意味着开发者无需关心内存的使用。...

    #资源分享达人# 代码审计[java安全编程].doc.zip

    总之,这份“代码审计[java安全编程].doc.zip”资源将为Java开发者提供宝贵的指导,帮助他们在编写代码时考虑安全因素,提升软件的整体安全性。通过深入学习和实践这些知识点,开发者可以更好地防御各种安全威胁,...

    Axis2_1.4.1客户端内存溢出

    解决内存溢出问题,首先应检查代码是否存在资源管理不当的问题,优化数据结构和算法,减少不必要的对象创建;其次,合理配置JVM参数,如增大堆内存大小;再者,使用内存分析工具(如VisualVM、MAT等),定位内存泄漏...

    Java内存泄露与溢出的区别.doc

    总的来说,理解Java内存泄露和溢出的区别有助于开发者编写更高效、更稳定的代码。通过合理地管理对象生命周期,避免长时间持有无用对象的引用,以及适当地配置JVM的内存参数,可以有效地防止这些问题的发生,提升...

    介绍堆栈,线程 如何解决内存溢出

    同时,“内存溢出问题.txt”将提供关于内存溢出的实例和解决方案,帮助你更好地应对这类问题。“堆栈说明.txt”则会深入讲解堆栈的工作原理、栈溢出及其预防措施。 通过深入学习和实践这些知识,你将能够有效地管理...

    JVM实战-对象访问与内存溢出异常解析

    2. **掌握Java堆内存溢出异常的测试**:通过编写程序不断地创建对象,直至消耗完所有可用的堆内存,从而触发`OutOfMemoryError`异常。 3. **掌握虚拟机栈和本地方法栈内存溢出异常的测试**:探究如何通过递归调用或...

Global site tag (gtag.js) - Google Analytics