美文网首页
Java虚拟机第四讲-内存溢出和内存泄露

Java虚拟机第四讲-内存溢出和内存泄露

作者: cp_insist | 来源:发表于2016-11-09 00:23 被阅读0次

一:基本概念:
内存泄露是指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述
内存溢出是指你的应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩溃,这事一种结果描述
而且通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。
二:类型以及解决办法:
内存泄露:
1)常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

2)偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

3)一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

4)隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
内存溢出
第一种OutOfMemoryError: PermGen space
发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generation space有关。解决这类问题有以下两种办法:

  1. 增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。如针对tomcat6.0,在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行:JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"如果是windows服务器还可以在系统环境变量中设置。感觉用tomcat发布sprint+struts+hibernate架构的程序时很容易发生这种内存溢出错误。使用上述方法,我成功解决了部署ssh项目的tomcat服务器经常宕机的问题。

  2. 清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。这种方法是网上部分人推荐的,我没试过,但感觉减少不了太大的空间,最靠谱的还是第一种方法。

第二种 OutOfMemoryError:Java heap space
发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。解决这类问题有两种思路:

  1. 检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。我以前写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Java heap space的内存溢出问题,后来通过修改程序得到了解决。
  2. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

第三种OutOfMemoryError:unable to create new native thread
无法创建新的线程,这种情况比较少见,

相关文章

  • java虚拟机-内存溢出与内存异常

    了解java虚拟机内存划分和各模块作用使得我们更加清楚如何使用内存,防止内存溢出和泄露。 一、Java内存区域的划...

  • 【内存】

    性能优化->虚拟机原理 怎么分析堆内存 内存泄露和内存溢出的原因 怎么做内存管理 JVM类加载机制Java内存区域...

  • 【java虚拟机】java内存区域分类

    在java当中,因为内存管理完全由java虚拟机完成,因此为了在发生内存泄露和内存溢出等问题时,更快的理解...

  • JVM之内存模型

    Java内存内存区域图 内存泄露和内存溢出的区别 内存泄露是指分配出去的内存没有被回收回来 内存溢出是指程序所需要...

  • 深入理解Java虚拟机-Java内存区域与内存溢出异常

    概述 Java程序员把内存控制的权力交给了Java虚拟机,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样...

  • 虚拟机内存划分

    当java程序员将内存控制的权利交给了Java虚拟机,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用...

  • java虚拟机阅读笔记(一)

    java程序员把内存控制的权力交给了虚拟机,一旦出现内存泄露和溢出的问题,如果不了解虚拟机是怎样使用内存的,排错会...

  • Android内存优化的三座大山

    内存优化的三座大山:内存泄露,内存溢出,内存抖动 (请先了解java虚拟机的垃圾回收机制,强引用,软引用,弱引用,...

  • Android内存优化1:JVM运行时数据区

    Java在虚拟机自动内存管理机制的帮助下,不容易出现内存泄露和内存溢出的问题,对于初入Android的程序员降低了...

  • Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子​

    JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看。 内存泄漏 & 内存溢出 1. 内存泄...

网友评论

      本文标题:Java虚拟机第四讲-内存溢出和内存泄露

      本文链接:https://www.haomeiwen.com/subject/dglzuttx.html