关于内存泄漏和内存溢出

前言

最近负责维护的一个项目出现了内存溢出的现象,今天就顺便说下内存泄漏和内存溢出

简单释义:

一、内存溢出和内存泄露
一种通俗的说法。
1、内存溢出:打个比喻,比如你申请了100个字节的空间,但是你在这个空间写入101或以上字节的数据,这时候就会出现溢出。
2、内存泄漏:你用新建一个对象,申请了一块内存,后来这个对象长时间都不再使用了(按理应该释放),但是因为一直被某个或某些实例所持有导致 GC 不能回收,也就是该被释放的对象没有释放。

下面具体介绍。

1.1 内存溢出
java.lang.OutOfMemoryError,是指程序在申请内存时,没有足够的内存空间供其使用,出现OutOfMemoryError。

产生原因

产生该错误的原因主要包括:

 1 JVM内存过小。
 2 程序不严密,产生了过多的垃圾。

程序体现
一般情况下,在程序上的体现为:

1 内存中加载的数据量过于庞大,如一次从数据库取出过多数据。
2 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收。
3 代码中存在死循环或循环产生过多重复的对象实体。
4 使用的第三方软件中的BUG。
5 启动参数内存值设定的过小。
错误提示
此错误常见的错误提示:

tomcat:java.lang.OutOfMemoryError: PermGen space
tomcat:java.lang.OutOfMemoryError: Java heap space
weblogic:Root cause of ServletException java.lang.OutOfMemoryError
resin:java.lang.OutOfMemoryError
java:java.lang.OutOfMemoryError

解决方法

1 增加JVM的内存大小

对于tomcat容器,找到tomcat在电脑中的安装目录,进入这个目录,然后进入bin目录中,在window环境下找到bin目录中的catalina.bat,在linux环境下找到catalina.sh。
编辑catalina.bat文件,找到JAVA_OPTS(具体来说是 set “JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%”)这个选项的位置,这个参数是Java启动的时候,需要的启动参数。
也可以在操作系统的环境变量中对JAVA_OPTS进行设置,因为tomcat在启动的时候,也会读取操作系统中的环境变量的值,进行加载。
如果是修改了操作系统的环境变量,需要重启机器,再重启tomcat,如果修改的是tomcat配置文件,需要将配置文件保存,然后重启tomcat,设置就能生效了。
2 优化程序,释放垃圾
主要思路就是避免程序体现上出现的情况。避免死循环,防止一次载入太多的数据,提高程序健壮型及时释放。因此,从根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间。

1.2 内存泄露

Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点:
1)首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;
2)其次,这些对象是无用的,即程序以后不会再使用这些对象。
如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

关于内存泄露的处理页就是提高程序的健壮型,因为内存泄露是纯代码层面的问题。

1.3 内存溢出和内存泄露的联系

内存泄露会最终会导致内存溢出
相同点:都会导致应用程序运行出现问题,性能下降或挂起。
不同点

  1. 内存泄露是导致内存溢出的原因之一,内存泄露积累起来将导致内存溢出。
  2. 内存泄露可以通过完善代码来避免,内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。

猜你喜欢

转载自blog.csdn.net/damokelisijian866/article/details/107469664