内存泄漏和内存溢出

内存泄漏和内存溢出(OOM)

内存泄漏

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因,程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果

1、内存泄漏的可能原因

  1. 存在长生命周期的对象,内部持有不适用对象的引用,导致不适用的垃圾对象无法回收
  2. 程序在运行的过程中不断分配内存,直到结束的时候才释放内存(比如一个服务器程序,需要运行几天,几周甚至几个月不释放内存,最终导致内存资源耗尽)

请添加图片描述

关于强软弱虚

1、强引用: 当内存不足时,JVM 开始进行 GC(垃圾回收),对于强引用对象,就算是出现了 OOM 也不会对该对象进行回收,死都不会收。

2、软引用:当系统内存充足的时候,不会被回收;当系统内存不足时,它会被回收,软引用通常用在对内存敏感的 程序中,比如高速缓存就用到软引用,内存够用时就保留,不够时就回收。

软引用对象它是在申请堆内存不足时,才会触发清理软引用对象;

3、弱引用:弱引用需要用到 java.lang.ref.WeakReference 类来实现,它比软引用的生存周期更短。对于只有弱引用的对象来说,只要有垃圾回收,不管 JVM 的内存空间够不够用,都会回收该对象占用的内存空间。

4、虚:虚引用需要 java.lang.ref.Phantomreference 类来实现。顾名思义,虚引用就是形同虚设。与其它几种引用不同,虚引用并不会决定对象的声明周期,虚引用的主要作用是跟踪对象被垃圾回收的状态,。

即便用了弱引用,仍然会产生内存泄漏,为什么与怎么办

why:如果没有发生GC回收的情况下该对象不会被清除

how:

  1. 可以自己调用 remove 方法将不要的数据移除避免内存泄漏的问题;

请添加图片描述

请添加图片描述

  1. 每次在做 set 方法的时候会清除之前 key 为 null;

内存溢出问题

what

内存溢出(Out Of Memory)应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的内存。

2、内存溢出的案例

1、数据库中存放几千万的数据,被我们Java程序全部获取ORM后的对象列表(解决就是通过limit 0,20)

2、代码中存在死循环或循环产生过多重复的对象实体

3、集合类中有对对象的引用,使用完后未清空,使得 JVM 不能回收;

4、启动参数内存值设定的过小

3、how

1.修改 JVM 启动参数,直接增加内存。(-Xms,-Xmx 参数 设置堆内存最大和最小值)

2.检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。

3、Jps 查看当前系统中有哪些 Java 进程在配合 Jmap 工具 查看堆内存占用情况 jmap -heap 进程 id

使用 java jconsole 或者 jvisualvm 阿里巴巴 Arthas 等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值