java内存泄露和内存溢出

上传人:大米 文档编号:432872378 上传时间:2022-09-15 格式:DOCX 页数:12 大小:30.52KB
返回 下载 相关 举报
java内存泄露和内存溢出_第1页
第1页 / 共12页
java内存泄露和内存溢出_第2页
第2页 / 共12页
java内存泄露和内存溢出_第3页
第3页 / 共12页
java内存泄露和内存溢出_第4页
第4页 / 共12页
java内存泄露和内存溢出_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《java内存泄露和内存溢出》由会员分享,可在线阅读,更多相关《java内存泄露和内存溢出(12页珍藏版)》请在金锄头文库上搜索。

1、Java 基础恶补内存泄露、内存溢出(2010-09-15 15:56:26)转载杂谈要点内存泄露是指程序中间动态分配了内存,但在程序结束时没有释放这部分 内存,从而造成那部分内存不可用的情况,重启计算机可以解决,但也有 可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷 引起的。 内存泄漏可以分为 4 类:1) 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行 的时候都会导致一块内存泄漏。2) 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过 程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也 许就变成了常发性的。所以测试环境和测试方法对检

2、测内存泄漏至关重 要。3) 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算 法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造 函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发 生一次。4) 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的 时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放 了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至 几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我 们称这类内存泄漏为隐式内存泄漏。 内存溢出类型:1) java.lang.OutOfMemoryErro

3、r: PermGen spacePermGen space 的全称是 Permanent Generation space, 是指内存的永 久保存区域。这块内存主要是被JVM存放Class和Meta信息的,Class 在被Loader时就会被放到PermGen space中,它和存放类实例(Instance) 的Heap区域不同,GC不会在主程序运行期对PermGen space进行清理。JVM由XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;JVM由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。该错误常见场合:a)应用中有很多Class,we

4、b服务器对JSP进行pre compile时。b)Webapp下用了大量的第三方jar,其大小超过了 JVM默认的大小(4M) 时。2)java.lang.OutOfMemoryError: Java heap space在JVM中如果98%的时间是用于GC且可用的Heap size不足2%的时候将 抛出此异常信息。JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。JVM内存的最大值跟操作系统有很大的关系。32位处理器虽然可控内存空 间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB (一般来说Win

5、dows系统下为1.5G-2G, Linux系统下为2G-3G),而64bit 以上的处理器就不会有限制了。注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了 物理内存或者操作系统的最大限制都会引起服务器启动不起来。该错误常见场合:a) Web 上传文件时。b) 开启大型文件或从数据库中一次取了太多的数据。相关问题1. Q: Java中会存在内存泄漏吗?A: Java中也存在内存泄露。当被分配的对象可达但已无用(未对作废数 据内存单元的引用置null)即会引起。如:Java 代码1. Vector v=new Vector(10);2. for (int i=1;i100;

6、i ) 3. Object o=new Object();4. v.add(o);5. o=null;6. 7. / 此时,所有的 Object 对象都没有被释放,因为变量 v 引用这些对 象。8. / 对象加入到 Vector 后,还必须从 Vector 中删除,最简单释放方法就 是将Vector对象设置为null。2. Q: 内存泄露、溢出的异同?A: 同:都会导致应用程序运行出现问题,性能下降或挂起。异:1) 内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内 存溢出。2) 内存泄露可以通过完善代码来避免;内存溢出可以通过调整配置来 减少发生频率,但无法彻底避免。3. 如何检测内

7、存泄露?A: 可以通过一些性能监测分析工具,如 JProfiler 、Optimizeit Profiler。4. Q:如何避免内存泄露、溢出?A: 1)尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。2)程序进行字符串处理时,尽量避免使用St ring,而应使用StringBuffer。因为每一个St ring对象都会独立占用内存一块区域,如:Java 代码1. String str = aaa;2. String str2 = bbb;3. String str3 = str str2;4. /

8、 假如执行此次之后 str , str2 再不被调用,那么它们就会在内存中等 待 GC 回收;5. / 假如程序中存在过多的类似情况就会出现内存错误;3)尽量少用静态变量。因为静态变量是全局的, GC 不会回收。4)避免集中创建对象尤其是大对象,如果可以的话尽量使用流操作。JVM会突然需要大量内存,这时会触发GC优化系统内存环境;一个案例如下:Java 代码1. / 使用 jspsmartUpload 作文件上传,运行过程中经常出现 java.outofMemoryError 的错误,2. / 检查之后发现问题:组件里的代码3. m_totalBytes = m_request.getCont

9、entLength();4. m_binArray = new bytem_totalBytes;5. / totalBytes 这个变量得到的数极大,导致该数组分配了很多内存空 间,而且该数组不能及时释放。6. / 解决办法只能换一种更合适的办法,至少是不会引发 outofMemoryError 的方式解决。7. / 参考: http:/ 大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决 一块释放一块的策略。6)不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对 象。可以适当的使用 hashtable,vector 创建一组对象容器,然后从容器 中去取那些对象,而

10、不用每次 new 之后又丢弃。7)优化配置。5. Q: 内存溢出的解决方案?A: 一是从代码层面进行优化完善,尽量避免该情况发生;二是调整优化服务器配置:1)设置-Xms、-Xmx相等;2)设置 NewSize、MaxNewSize 相等;3)设置 Heap size, PermGen space:Tomcat 的配置示例:修改 %TOMCAT_HOME%/bin/catalina.bator catalina.sh在“ echo Using CATALINA_BASE: $CATALINA_BASE”上面加入以下行:Cmd代码1. set JAVA_OPTS=-Xms800m -Xmx800

11、m -XX:PermSize=128M -XX:MaxNewSiz e=256m -XX:MaxPermSize=256m/内存泄露与溢出区别,何时产生内存泄露?文章分类:Java编程内存溢出是由于jvm虚拟内存不够!而泄漏则是另种概念!1下面实在摘抄的内容!下面,我们就可以描述什么是内存泄漏。在Java中,内存泄漏就是存在一些被 分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图 中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用 这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄 漏,这些对象不会被GC所回收,然而它却占用内存。

12、在C+中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可 达,由于C+中没有GC,这些内存将永远收不回来。在Java中,这些不可达的 对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。通过分析,我们得知,对于C+,程序员需要自己管理边和顶点,而对于Java 程序员只需要管理边就可以了(不需要管理顶点的释放)。通过这种方式,Java提高了编程的效率。因此,通过以上分析,我们知道在Java中也有内存泄漏,但范围比C+要小一 些。因为 Java 从语言上保证,任何对象都是可达的,所有的不可达对象都由 GC 管理。对于程序员来说, GC 基本是透明的,不可见的。虽然,我们只有几

13、个函数可以 访问GC,例如运行GC的函数System.gc(),但是根据Java语言规范定义,该 函数不保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能使用不 同的算法管理GC。通常,GC的线程的优先级别较低。JVM调用GC的策略也有很 多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有 的是平缓执行GC,有的是中断式执行GC。但通常来说,我们不需要关心这些。 除非在一些特定的场合,GC的执行影响应用程序的性能,例如对于基于Web的 实时系统,如网络游戏等,用户不希望GC突然中断应用程序执行而进行垃圾回 收,那么我们需要调整GC的参数,让GC能够通过平缓的方式

14、释放内存,例如将 垃圾回收分解为一系列的小步骤执行,Sun提供的Hot Spot JVM就支持这一特性。下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请Object 对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那 么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果 对象加入到 Vector 后,还必须从 Vector 中删除,最简单的方法就是将 Vector 对象设置为 null。Java 代码1. Vector v=new Vector(10);2. for (int i=1;i100; i+)3. 4.5.6.7.Obje

15、ct o=new Object(); v.add(o);o=null;/此时,所有的Object对象都没有被释放,因为变量v引用这些对象怎样解决内存溢出一、内存溢出类型1、java.lang.OutOfMemoryError: PermGen spaceJVM 管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是, 是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆 不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应 用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存 的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会 将context更改为新部署的,非堆存的内容就会越来越多。PermGen space 的全称是 Permanent Generati

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号