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

[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()中适当释放资源


http://www.kler.cn/news/273748.html

相关文章:

  • K8s的概念
  • 云原生 PaaS 服务:构建现代应用的利器(分布式应用服务、配置中心、数据库服务、定时任务、实时监控、服务网关、技术组件)
  • 【备忘录】查询数据库中是否存在数据 的SQL语句性能对比和优化
  • 蓝桥杯算法基础(20):(快速排序的其他优化)java版
  • IDEA中的Project工程、Module模块的概念及创建导入
  • c++复数计算器
  • 陪诊系统有什么方便之处
  • 初次文件包含漏洞
  • 关于相机与镜头的选型
  • 使用ansible剧本进行lvm分盘
  • phpStudy安装thinkCMF8时,如何解决服务器rewrite和APIrewrite不支持的问题
  • UGUI源码分析与研究1-UGUI底层的实现原理
  • Java后端面试:框架篇高频面试(Spring、SpringMVC、SpringBoot、MyBatis)
  • 【渗透工具】BurpSuite汉化无cmd框版安装教程
  • Flutter-自定义图片3D画廊
  • 蓝桥杯刷题总结(Python组)
  • 信雅纳网络测试的二次开发集成:XOA(Xena Open-Source Automation)开源自动化测试
  • 目标检测——YOLOv5算法解读
  • 高架学习笔记之信息系统分类概览
  • 比较两个数组对象,找出属性id相同的项并删除
  • P8711 [蓝桥杯 2020 省 B1] 整除序列 存疑解决篇 Python
  • 爬虫技术实战案例解析
  • Java基础知识总结(6)
  • 超分之SwinIR
  • 【NLP学习记录】One-Hot编码
  • 电商api数据接口技术开发来赞达lazada通过商品ID抓取商品详情信息item_get请求key接入演示
  • 代码随想录--排序算法
  • LeetCode 面试经典150题 27.移除元素
  • 如何搭建“Docker Registry私有仓库,在CentOS7”?
  • Linux-MDK can电机带导轨 C++封装