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

内存泄漏和内存溢出简述

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

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

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

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

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

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

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

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

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

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

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


http://www.mrgr.cn/news/39273.html

相关文章:

  • 基于单片机的可调式中文电子日历系统
  • STM32+ADC+扫描模式
  • 技术速递|Python in Visual Studio Code 2024年9月发布
  • 数仓建模:DataX同步Mysql数据到Hive如何批量生成建表语句?| 基于SQL实现
  • 二分查找详解(Java版)
  • 【Linux】Docker下载与使用-nginx
  • 【在Linux世界中追寻伟大的One Piece】命名管道
  • 基于springboot+小程序的儿童预防接种预约管理系统(疫苗1)(源码+sql脚本+视频导入教程+文档)
  • 使用USB Network Gate借用远程USB设备
  • .lcrypt勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • 5个你一定要知道的Word使用小技巧
  • 【D3.js in Action 3 精译_025】3.4 让 D3 数据适应屏幕(中)—— 线性比例尺的用法
  • C++【类和对象】(取地址运算符重载与实现Date类)
  • 简历解析的疑问?
  • 20.1 分析pull模型在k8s中的应用,对比push模型
  • 【算法】分治:归并排序之 315.计算右侧小于当前元素的个数(hard)
  • PostgreSQL的扩展Citus介绍
  • 建造者模式
  • C++:模拟实现vector
  • unix中的exec族函数介绍