Android:程序运行时产生内存泄漏有那些,进行重新分配策略又有哪些?

内存泄漏是一种常见的编程问题,它通常是由于程序员在编写代码时没有正确地管理内存而导致的。当一个应用程序分配了内存但不再需要它时,它应该将其返回给操作系统以供重新分配使用,但如果没有这样做,就会导致内存泄漏。

内存泄漏可能会导致应用程序的速度变慢,甚至崩溃,因为它们可以消耗大量的系统资源,导致系统变得不稳定。在长时间运行的程序或服务器上,内存泄漏可能会导致可用内存被耗尽,从而影响程序的性能和可靠性。

在这里插入图片描述

内存泄漏通常分为一下四类

1)常发性内存泄漏

发生内存泄漏的代码会被多次执行,每行一次执行都会导致一块内存泄漏。这种类型的内存泄漏是较为常见的,并且可能会导致程序运行缓慢或崩溃。

2)偶发性内存泄漏

发生内存泄漏的代码只在某些特定的环境或操作中才会发生,常发性和偶发性是相对的,在特定的环境下,偶发性内存泄漏也许就变成了常发性。这种类型的内存泄漏比较难以发现和修复,因为它们不一定会立即导致问题。

3)一次性内存泄漏

发生内存泄漏的代码只被执行一次。这种类型的内存泄漏通常比较容易修复,因为它们只发生一次,可以比较容易地找到问题并修复它们。

4)隐式内存泄漏

程序在运行过程中不停的分配内存,但直到结束时才释放内存,严格的说,并没有发生内存泄漏,因为程序最终释放了内存,但是在服务器上一个程序,通常运行时间长,不及时释放内存也可能导致内存耗尽;这类被称为隐式内存泄漏。这种类型的内存泄漏通常比较难以发现和修复,因为它们可能不会立即导致问题,但是随着时间的推移可能会导致问题。

内存分配策略

程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配,对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、栈区和堆区

静态存储区(方法区)
主要存放静态数据、全局 static 数据和常量;这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在

栈区

当方法被执行时,方法体内的局部变量(其中包括基础数据类型、对象的引用)都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放;因为栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限

堆区

又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存,也就是对象的实例;这部分内存在不使用时将会由 垃圾回收器来负责回收

栈与堆的区别

在方法体内定义的(局部变量)一些基本类型的变量和对象的引用变量都是在方法的栈内存中分配的

当在一段方法块中定义一个变量时,Java 就会在栈中为该变量分配内存空间,当超过该变量的作用域后,该变量也就无效了,分配给它的内存空间也将被释放掉,该内存空间可以被重新使用

堆内存用来存放所有由 new 创建的对象(包括该对象其中的所有成员变量)和数组

在堆中分配的内存,将由垃圾回收器来自动管理;在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,这个特殊的变量就是我们上面说的引用变量;我们可以通过这个引用变量来访问堆中的对象或者数组

举个例子

publicclassSample{ ints1 = 0;
 Sample mSample1 = newSample();
 publicvoidmethod(){ ints2 = 1; Sample mSample2 = newSample();
Sample mSample3 = newSample();
 } 

Sample 类的局部变量 s2 和引用变量 mSample2 都是存在于栈中,但 mSample2 指向的对象是存在于堆上的; mSample3 指向的对象实体存放在堆上,包括这个对象的所有成员变量 s1 和 mSample1,而它自己存在于栈中

结论

局部变量的基本数据类型和引用存储于栈中,引用的对象实体存储于堆中;因为它们属于方法中的变量,生命周期随方法而结束

成员变量全部存储与堆中(包括基本数据类型,引用和引用的对象实体)—— 因为它们属于类,类对象终究是要被 new 出来使用的。

本文 全面介绍了内存泄露的泄漏及分配机制, 希望大家在开发时尽量避免内存泄露的出现;为了是大家能够更好的学习 Android 相关的知识点, 在这里特别提供一份 Android八大模块进阶学习笔记, 里面包含了这些年学习 Android 开发所遇到的难题及其解决方案;有需要这份 Android八大模块进阶笔记 的朋友可以加微信 即可免费领取!

《Android八大模块进阶笔记》

在这里插入图片描述

相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

一、源码解析合集

在这里插入图片描述

二、开源框架合集

在这里插入图片描述

同时这里还搭建了一个基于chatGPT的微信群聊机器人,24小时为大家解答疑难技术问题

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值