内存泄漏和内存溢出

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、启动参数内存值设定的过小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文基于针对集合类对象的内存泄漏检测方案实现了口oudFoundry云平台 中Java应用内存泄漏的检测,通过监控集合类对象的内存消耗和集合内元素的 使用情况,得出对象内存泄漏的可能性大小,量化对象内存泄漏的风险。检测 系统首先收集垃圾回收事件后的应用内存数据,确定进行内存泄漏分析的时间 区间。然后通过收集每次垃圾回收事件后对象之间的引用关系和对象内存大小, 计算得到集合类对象的内存影响值。接着通过修改字节码的方式获取到集合类 对象使用集合内元素的数据,计算出相应的元素使用影响值。最后根据内存影 响值和元素使用影响值计算出集合对象的可信值,并提供对象的初始化位置信 息用于定位可疑对象。 本文主要使用JavaInstrument,ASM,JVMInterfaceTools等技术实现了内 存泄漏检测系统,该系统根据功能划分为JavaAgent、NativeAgent和可信值计 算H个模块,JavaAgent主要用于收集集合内元素使用数据,NativeAgent主要 用于收集内存使用数据。我们将该内存检测系统部署在CloudFoundry上,作为 云平台中应用性能管理工具的一部分,为云平台用户提供Java应用内存泄漏检 测功能,帮助开发者定位和解决内存泄漏问题。此外,本文还对该系统进行了 可用性测试和运行时系统负载测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值