一文读懂程序运行时产生内存泄漏之后,进行重新分配策略有哪些?

引言

内存泄漏一般是由于我们编码缺陷导致的,首先明确一下内存泄漏的定义,就是应用程序不需要,但是又不能返回给操作系统以供重新分配使用,导致可用内存越来越少的现象

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

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 高级开发学习笔记 的朋友: 可以私信 发送 “笔记” 即可 免费获取; 希望大家阅读过后,能够 查漏补缺;早日成为高级开发者

笔记中包括以下七大知识点板块:

一、JAVA 知识点汇总
二、Android 知识点汇总
三、Android 扩展知识点
四、Android 开源库源码分析
五、设计模式汇总
六、Gradle
七、常见面试算法题汇总

部分内容展示如下:

Android 高级开发学习笔记目录

JAVA 知识点汇总
  • JVM
  • static
  • final
  • String/StringBuffer/StringBuilder
  • 异常处理
  • 内部类
  • 多态
  • 抽象与接口
  • 集合框架
  • 反射
  • 单例
  • 线程
  • volatile
  • synchronized
  • lock
  • 引用类型
  • 动态代理
  • 元注解

完整版 Android 高级开发学习笔记获取方式:私信 发送 “笔记” 即可 免费获取

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

加油!各位 Android 开发者们

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值