简单说一说Java的内存泄漏

1.java内存中的堆和栈的区别

通俗意义上的理解,两者都属于内存的一部分,只是两者所保存的数据不一样而已,基本类型的变量都保存在栈中,而引用类型的变量类似于对象和数组都保存在堆中,但是引用类型的变量亦或者对象的引用变量是存在栈中的。

2.内存的泄漏和内存的溢出

从字面意思上说,内存泄漏和内存溢出好像是同一个意思,但是其实里面是有很大不同的。内存溢出大家都知道,当出现向资源管理器申请内存资源的时候,所申请到的资源不够盛放我们的变量的时候,那么此变量就会溢出来,这是资源管理器是不知道的,那么变量所溢出来的字节就会可能被覆盖或者被访问,这样就会导致程序出错。比如说,一个Long型的变量却申请到了Integer型的内存来存储,那么就会Long型变量就会溢出。而内存泄漏其实指的是向资源管理器申请到资源却没有把这些资源释放出来,最终导致这些资源是一个孤岛无人区一样,与其说是内存泄漏倒不如说是内存脱离。

3.常见的内存泄漏有哪些?

3.1在程序开发过程中经常会用到集合类,例如Hashmap和Arraylist等都是容易出现问题的,当他们被定义为静态的时候,那么他们的生命周期将与程序一致,这将导致容器中的对象在程序结束之前不能得到释放,从而造成内存泄漏。

3.2变量的作用域不合理,如果一个变量定义的作用范围超出其使用范围,那么极其容易造成内存泄漏。例如全局变量A在使用过程中,引用了一个局部变量B,在局部变量B使用完毕后,变量A还在引用B,这将导致变量B得不到释放,出现内存泄漏。如下:

public String A;

public void memoryTest()

{

public String B ="test memory";

A=B;

}

3.3常见的数据库连接或者IO连接等如果忘记了关闭连接,会造成大量的对象无法被回收,也会引起内存泄漏。

3.4单例模式有可能造成内存泄漏,因为单例模式容易产生静态引用变量。

4.说了那么多内存泄漏,那我们该怎么规避呢?

1.尽量不要使用静态类变量,定义变量的时候要想着变量的作用域。

2.一个变量使用完毕以后,尽量把该变量设置为null,这样垃圾回收器就会回收掉。

3.写代码要仔细啦,多review~


猜你喜欢

转载自blog.csdn.net/horero/article/details/78821823