内存泄漏和内存溢出

原创 2018年04月15日 15:06:28

https://www.cnblogs.com/panxuejun/p/5883044.html
这篇博客写的很好

几句话总结如下:
一、内存泄漏:不再使用的对象持续战友内存或者无用的内存得不到释放,从而造成内存空间的浪费。
产生原因:长生命周期的对象持有短生命周期对象的引用。
如下2个例子:
1、静态集合类引起内存泄漏
像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们也将一直被Vector等引用着。

Static Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}//

在这个例子中,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身(o=null),那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。因此,如果对象加入到Vector 后,还必须从Vector 中删除,最简单的方法就是将Vector对象设置为null。

2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用。

public static void main(String[] args)
{
Set<Person> set = new HashSet<Person>();
Person p1 = new Person("唐僧","pwd1",25);
Person p2 = new Person("孙悟空","pwd2",26);
Person p3 = new Person("猪八戒","pwd3",27);
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素!
p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变

set.remove(p3); //此时remove不掉,造成内存泄漏

set.add(p3); //重新添加,居然添加成功
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素!
for (Person person : set)
{
System.out.println(person);
}
}

二、内存溢出
内存泄漏有可能没有任何影响,如果程序持续运行,内存泄漏有可能导致内存溢出。
内存溢出的几种情况:
1、OutOfMemory异常。除了程序计数器,虚拟机内存的其他几个运行区域都有发生OutOfMemory异常的可能。
2、栈溢出StackOverFlowError 线程请求的栈深度大于虚拟机所允许的最大深度,将抛出异常。

产生原因总结如下:
1、内存中加载的数据量过于庞大,如一次从数据库中取出过多数据
2、集合类中有对对象的引用,使用完后没有清空,是的JVM不能回收
3、代码存在死循环
4、启动参数内存值设定的过小

内存泄漏与内存溢出的区别?

内存泄漏内存泄漏(memory leak): 是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 一般我们所说的内存泄漏是...
  • zhang_jun_ling
  • zhang_jun_ling
  • 2016-03-30 20:47:11
  • 2500

内存泄漏和内存溢出的区别和联系

1、内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 2、内存溢出 out of memo...
  • ruiruihahaha
  • ruiruihahaha
  • 2017-04-20 16:46:25
  • 3624

内存溢出和内存泄漏的区别,产生原因以及解决方案

一、概念与区别 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请 了一个integer...
  • ShanYu1198124123
  • ShanYu1198124123
  • 2016-09-02 15:31:42
  • 13791

内存泄露,内存溢出

一:内存泄漏,内存溢出内存泄露:是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存...
  • qq_36721018
  • qq_36721018
  • 2017-12-06 21:07:02
  • 327

OC学习第九天_1 内存泄露 内存溢出 野指针异常

1.什么是内存泄漏 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,不能被任何程序再次使用,直到程序结束。即所谓内存泄漏。简单的说就是申请了一块内存空...
  • Ios_secret_lover
  • Ios_secret_lover
  • 2015-11-06 20:14:24
  • 1695

内存泄漏与内存溢出总结

导读:本篇文章是最近几天关于内存优化的个人学习总结,从基础到日常常见的内存泄漏的顺序慢慢介绍…本编全文本,可能有些单调,不过认真看下来,肯定收益良多!如果急着解决,直接看 “常见的内存溢出处理”,”常...
  • u012792686
  • u012792686
  • 2017-04-08 12:14:00
  • 1185

Android 内存溢出和内存泄漏的区别以及造成的原因

一、原理 内存溢出(Out of memory): 内存泄漏(Memory leak): 二
  • qq_28607155
  • qq_28607155
  • 2017-07-26 15:40:47
  • 354

Java中常见内存泄露和内存溢出错误总结

首先要弄明白两个概念:内存泄露和内存溢出。     内存泄露是指垃圾没有被完全回收,就是有空间但是要不回来;     内存溢出则是空间根本不够用。 两者虽然不同但是可能导致相同的后果。 1、java....
  • hw20070575
  • hw20070575
  • 2016-03-27 20:08:51
  • 1178

Android 内存溢出和内存泄漏的区别

android 内存泄漏 内存溢出
  • u013435893
  • u013435893
  • 2016-01-29 16:39:10
  • 5725

Mat工具查看内存泄露和内存溢出情况

首先需要去下一个MAT工具。地址如下:http://download.eclipse.org/mat/1.5/update-site/安装好了工具之后就需要我们去实现查找内存泄露的原因了. 在进...
  • u012515603
  • u012515603
  • 2015-12-16 18:43:05
  • 1279
收藏助手
不良信息举报
您举报文章:内存泄漏和内存溢出
举报原因:
原因补充:

(最多只允许输入30个字)