当前位置: 首页 > news >正文

内存泄漏和内存溢出简述

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

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

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

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

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

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

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

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

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

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

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

相关文章:

  • 9、论文阅读:无监督的感知驱动深水下图像增强
  • Modbus协议和PLC协议的区别和联系
  • 丹摩智算平台部署 Llama 3.1:实践与体验
  • R语言Shiny包新手教程
  • 11-pg内核之锁管理器(六)死锁检测
  • 【解决方案】git错误:对象文件为空 error: object file
  • vincent,一个超酷的Python库
  • 详解Linux文件系统
  • 前端大模型入门:使用Transformers.js手搓纯网页版RAG(二)- qwen1.5-0.5B - 纯前端不调接口
  • git 基本原理
  • 软件设计——随手笔记
  • Pencils Protocol 全面推动市场,生态通证 DAPP 将持续通缩
  • 十进制与ip地址转换公式(EXCEL公式)
  • 【系统架构设计师】专题:系统分析和设计
  • Unity 与虚幻引擎对比:两大游戏开发引擎的优劣分析
  • LLM - 使用 XTuner 指令微调 多模态大语言模型(InternVL2) 教程
  • ​IAR全面支持国科环宇AS32X系列RISC-V车规MCU
  • 小灰的基金,终于回血了!
  • 百度智能体创建:情感领域的创新力量
  • 单位向量的定义和举例说明
  • 巴基斯坦称对印精准打击造成设施损坏和人员伤亡
  • 可量产9MWh超大容量储能系统亮相慕尼黑,宁德时代:大储技术迈入新时代
  • 四川资阳市原市长王善平被双开,“笃信风水,大搞迷信活动”
  • 2024年上市公司合计实现营业收入71.98万亿元
  • 2025上海科技节将于5月17日开幕,拟设6大板块专题活动
  • 美国与胡塞武装达成停火协议,美伊相向而行?