内存溢出和内存泄露的区别

1 内存溢出

内存溢出(OutOfMemory,OOM)是指程序在申请内存时,没有足够的内存空间供其使用,出现OOM。在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OOM异常的可能

public class OOMDemo {
	static class OOMObejct{
	}
	
	public static void main(String[] args) {
		List<OOMObejct> list = new ArrayList<OOMDemo.OOMObejct>();
		
		while(true){
			list.add(new OOMObejct());
		}
	}
}

备注:

将VM arguments设置为:-verbose:gc -Xms20M-Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8

运行结果:




2 内存泄露

内存泄露Memory Leak是指对象已经没有被程序使用,但是垃圾回收期没法移除他们,因为还被其他对象引用着。

2.1内存泄露原因分析



对象obj5、obj6和obj7虽然互相连接,但是它们到GC Roots是不可达,因此会被判定为可回收对象。

obj3是有用对象,因为其引用obj4,obj2则是无用对象。但是由于obj2和obj3都可到达GC Roots,因此都不会被GC回收,正是obj2这种无用且不会被GC回收的对象占用着内存不释放,导致内存泄露发生。


2.2常见内存泄露场景

1)集合对象如HashMap,ArrayList等,特别是当它们被声明为static时,它们的生命周期就会和应用程序一样长,容易引发内存泄漏。

2)在JDK6中,String.substring()方法也容易导致内存泄露。虽然在会新生成一个字符串对象,但是仍然保留着对原对象的字符数组的引用,导致原字符串无法被GC。在JDK7中这个问题已经解决。

3当一个 监听器 在使用的时候被 注册 ,但不再使用之后却未被 注销 。在OSGI框架中,启动时注册一个服务监听器,关闭时要记得将服务监听器移除。


3 参考文献

 [1].周志明, 深入理解Java虚拟机:JVM高级特性与最佳实践.第 2 版. 2015: 机械工业出版社.




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值