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

[Java、Android面试]_05_内存泄漏和内存溢出

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。

整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注+收藏

文章目录

    • 1. 内存泄漏
    • 2. 内存溢出

1. 内存泄漏

内存泄露是指申请了一块内存,但没有及时释放,这块内存就会一直被占用而无法被分配,这样就出现了内存泄露。

(1)内存泄露的四种状态:
常发性内存泄漏: 发生泄露的代码经常性被执行,每次都会泄露一块内存;

偶发性内存泄露: 发生内存泄露的代码只有在特定环境和操作过程中才会发生;

一次性内存泄露: 发生内存泄露的代码仅会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅一块内存发生泄露。例如:在类的构造函数中分配内存,在析构函数中却没有释放内存,这里就仅发生一次。

隐式内存泄漏: 程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

(2)内存泄露实例:
单例、线程、hander都可能造成内存泄露。下面展示单例造成的内存泄露实例:

//单例需要传入一个Context,所以这个Context的生命周期的长短至关重要:
public class AppManager {private static AppManager instance;private Context context;private AppManager(Context context) {this.context = context.getApplicationContext();// 1.这里传入一个Application的Context:这将没有任何问题,因为单例的		生命周期和Application的一样长//this.context = context;// 2、传入的是Activity的Context:当这个Context所对应的Activity退出时,由于该Context和Activity的生命周期一样长(Activity间接继承于Context),所以当前Activity退出时它的内存并不会被回收,因为单例对象持有该Activity的引用。    }public static AppManager getInstance(Context context) {if (instance != null) {instance = new AppManager(context);}return instance;}
}

单例的静态特性使得单例的生命周期和应用的生命周期一样长,这就说明了如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。
怎样解决呢?
可以是用对context使用软引用或弱引用的方式进行引用。

2. 内存溢出

系统无法分配需要的内存,就会造成OOM.
产生原因及如何避免:
(1)图片过大导致OOM:对图片进行质量压缩或尺寸压缩
(2)对不需要的使用的资源进行释放内存
(3)查询数据库没有关闭游标
(4)在Activity生命周期onPause()、onStop()、onDestory()中适当释放资源

相关文章:

  • 由浅到深认识C语言(13):共用体
  • 1060:均值
  • 百度paddleocr GPU版部署
  • 如何实现自己的Spring Boot Starter
  • c语言游戏实战(8):飞机大作战
  • [嵌入式系统-39]:龙芯1B 开发学习套件 -9-PMON的文件结构
  • js【详解】深拷贝
  • Java学习笔记之Java基础语法02-运算符
  • c语言运算符优先级介绍
  • 20240316-1-向量化搜索
  • EMC Unity存储系统(包含VNXe)常用检查命令
  • 大模型: Function calling的作用
  • 整型溢出问题及解决之道
  • 【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0 App+微信小程序+云平台
  • 【MySQL】InnoDB引擎
  • ECMAScript入门(七)--Module语法
  • ERLANG 网工修炼笔记 ---- UDP
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • jquery cookie
  • mongodb--安装和初步使用教程
  • Vim 折腾记
  • VUE es6技巧写法(持续更新中~~~)
  • 给Prometheus造假数据的方法
  • 线上 python http server profile 实践
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C语言)字符分类函数
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (简单) HDU 2612 Find a way,BFS。
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)Linux整合apache和tomcat构建Web服务器
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .Net 6.0 处理跨域的方式
  • .Net Core和.Net Standard直观理解
  • .net MySql
  • .NetCore部署微服务(二)
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @KafkaListener注解详解(一)| 常用参数详解
  • @media screen 针对不同移动设备
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [C#]C#学习笔记-CIL和动态程序集
  • [C/C++]关于C++11中的std::move和std::forward
  • [C语言]一维数组二维数组的大小
  • [HDU5685]Problem A