内存泄漏和内存溢出简述

面试问的挺多的,这里简单记录一下。

内存泄漏: 不再使用的对象没有被回收,导致可用内存逐渐减少。
常见原因:

  • 静态集合:对象存到了集合里面(如HashMap或ArrayList),未被清理。
  • 事件监听:未取消对事件源的监听,导致对象持续被引用。
  • 线程:未停止的线程可能持有对象引用,无法被回收。

内存溢出: JVM申请内存时,无法找到足够的内存,引发OOM。
常见原因:

  • 大量对象创建:程序不断创建大量对象,超出JVM堆的限制。
  • 持久引用:大型数据结构(如缓存、集合等)长时间持有对象引用,导致内存累积。
  • 递归调用:深度递归导致栈溢出。

JVM内存结构有哪几种内存溢出的情况?

  • 堆内存溢出: 代码中可能存在大对象分配,或者发生内存泄漏。导致在多次GC后,还是无法对当前对象分配内存。
  • 栈溢出: 递归层数过深。
  • 元空间溢出: 类加载过多。如果系统在运行过程中加载了过多的类(例如大量反射操作或动态生成类),这些类的元数据会逐渐耗尽元空间,导致溢出。

内存泄漏和内存溢出的例子及解决办法

  • 静态属性导致内存泄漏: 大量使用static静态变量。在Java中,静态变量的生命周期通常伴随着应用整个生命周期。
    解决办法: 第一,尽量减少静态变量;第二,如果使用单例,尽量使用懒加载。

  • 未关闭的资源: 创建一个连接或者打开一个流,忘记关闭会阻塞内存。
    解决办法: 在finally中关闭资源。

  • 使用ThreadLocal :ThreadLocal是个弱引用作为key,系统GC时势必会被回收,这样一来,ThreadLocalMap就会出现key为null的entry,就没有办法访问这些entry的value,白白占用了内存空间。
    解决办法: 手动使用remove()方法清除entry。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值