【Android】之【内存管理】

news2024/11/28 10:57:12

一、Android内存运行是如何运行的?

物理内存即移动设备上的ram,当启动一个android程序时,会启动一个dalvik vm进程,系统会给它分配固定的内存空间【16m,32m,64m,不定,没有统一标准,每个虚拟机会有堆内存阈值限制(值得一提的是这个阈值一般都由厂商依据硬件配置及设备特性自己设定它的配置是在Android的属性系统的/system/build.prop中配置dalvik.vm.heapsize=128m即可】,这块内存空间会映射到ram上某个区域。ART 和 Dalvik 虚拟机使用分页和内存映射来管理内存。 然后这个android程序就会运行在这块空间上。java里会将这块空间分成stack栈内存和heap堆内存。stack里存放对象的引用,heap里存放实际对象数据。
在程序运行中会创建对象,如果未合理管理内存,比如不及时回收无效空间就会造成内存泄露,严重的话可能导致使用内存超过系统分配内存,即内存溢出oom,导致程序卡顿甚至直接退出。

二、Java运行时内存

Java内存区域是指Java虚拟机所管理的内存区域,通常包括以下几个部分:

在这里插入图片描述

  • 堆(Heap):是Java虚拟机中最大的一块内存区域,用于存放Java对象实例。Heap通常被所有线程共享,所有新创建的对象都会被放到Heap中,由Java垃圾回收器对其进行管理和清理。Heap内存大小的设定可以通过JVM启动参数进行控制。

  • 栈(Stack):是每个线程私有的一块内存区域,用于存放线程执行时的方法调用栈。每当一个方法被调用时,就会创建一个栈帧,栈帧包括了方法的参数、局部变量等信息,栈帧在方法执行结束后会被弹出。

  • 方法区(Method Area):用于存储已加载的类的信息(包括类名、字段、方法信息等),所有线程共享。方法区也称为永久代(PermGen),之所以称为“永久代”,是因为这部分内存通常不会被回收,直到JVM进程退出。

  • 程序计数器(PC Register):用于记录线程执行的位置信息,每个线程都有一个PC Register,当线程执行Java方法时,程序计数器记录的是虚拟机字节码指令的地址。而当线程执行本地方法时,程序计数器的值为undefined。

  • 本地方法栈(Native Method Stacks):与Java栈非常相似,但用于执行本地方法时的方法调用栈。

  • 直接内存(Direct Memory):Java NIO中的一种内存区域,是一种堆外内存,可以通过ByteBuffer等类使用。直接内存虽然不受Java虚拟机直接管理,但它仍然被操作系统和CPU的内存管理单元进行管理和访问。

总的来说,Java内存区域是Java虚拟机中内存管理的核心部分,程序员可以通过了解和掌握Java内存区域的规则和使用方式,有效地提升Java程序的性能和稳定性。

三、内存优化问题

Android中关于内存优化的问题主要包括三个方面:

1、 Memory Leaks 内存泄漏
2、 OutOfMemory 内存溢出
3、Memory Churn 内存抖动

Memory Leaks 内存泄漏

内存泄漏(Memory
Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果

● 内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测;因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃

● 随着计算机应用需求的日益增加,应用程序的设计与开发也相应的日趋复杂,开发人员在程序实现的过程中处理的变量也大量增加,如何有效进行内存分配和释放,防止内存泄漏的问题变得越来越突出

● 例如服务器应用软件,需要长时间的运行,不断的处理由客户端发来的请求,如果没有有效的内存管理,每处理一次请求信息就有一定的内存泄漏;这样不仅影响到服务器的性能,还可能造成整个系统的崩溃;因此,内存管理成为软件设计开发人员在设计中考虑的主要方面

out of memory内存溢出

out of memory英文意思是电脑内存不足,我们都清楚,电脑程序的运行不仅仅对电脑CPU进行消耗,同时对内存也会进行占用,当占用到一定存度就会出现内存不足的情况,这时电脑系统就会出现out of memory错误提示,那么哪些情况会出现out of memory情况呢

● 运行的程序相对占用内存较多,出现这种情况大多是一些特别大型的程序,例如3DsMax,Maya

● 电脑打开的程序过多,这样因程序过多点用的内存资源过多也会出现out of memory问题

● 电脑病毒感染,如果电脑中毒了,这时大量的内存被病毒点用掉了,这时同样会出现out of memory提示信息

● 电脑设置不正确或电脑程序运行配置不正确

Memory Churn内存抖动

内存抖动是因为大量的对象被创建又在短时间内马上被释放

● 瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC

● 即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC;这个操作有可能会影响到帧率,并使得用户感知到性能问题

四、参考

  • 内存指的是什么?一文带你了解Android的内存优化

  • Android性能优化:手把手带你全面了解 内存泄露 & 解决方案

  • Android 虚拟机、对象、变量的内存分配

  • Android性能调优篇之探索JVM内存分配

  • android studio profiler 内存分析用法【官网】

  • Android 从内存模型深究内存优化本质

  • 深入理解Java虚拟机——Java内存区域

  • 内存优化 · 基础论 · 初识Android内存优化

  • Android内存优化深入解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Minecraft开服教程】使用 MCSM 面板一键搭建我的世界服务器,并内网穿透公网远程联机

文章目录前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址7. 使用固定公网地址远程联机前言 MCSManager是一个开源…

C++ float 数据的保存格式

总体上,在计算机中, float 数据的的保存按照如下转换逻辑:10进制数 >二进制数>科学计数法二进制数>c 条件下下浮点数在内存中的保存格式(这里面有个转换算法,需要理清楚)。 下面举出一个案例&…

Python+selenium自动化测试实战项目(全面,完整,详细)

前言 之前的文章说过, 要写一篇自动化实战的文章, 这段时间比较忙再加回家过清明一直没有更新,今天整理一下实战项目的代码共大家学习。(注:项目是针对我们公司内部系统的测试,只能内部网络访问,外部网络无…

使用fetch()异步请求API数据实现汇率转换器

任务8 https://segmentfault.com/a/1190000038998601 https://chinese.freecodecamp.org/news/how-to-master-async-await-with-this-real-world-example/ 跟随上面的指示,理解异步函数的编写,并且实现这个汇率转换器。 第一步:在工作区初始…

AI失业潮来袭,某些部门裁员过半

历史的车轮滚滚向前,每次生产力的大幅跃进,都会造成一批失业潮。想当年,纺纱机的出现让无数手工作坊的织布师傅失业。如今,在AI技术的催化下,同样的事正在互联网行业的各个领域重演。疯狂的裁员浪潮 “AI15秒做的&…

图神经网络汇总和总结

下面所有博客是个人对EEG脑电的探索,项目代码是早期版本不完整,需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED 相关论文阅读分析: 1、EEG-SEED数据集作者的—基线论文阅读和…

LeetCode——二叉树的层序遍历

102. 二叉树的层序遍历 I 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]…

超级详解MySQL执行计划explain

1、什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解。 MySQL本身的功能架构分为三个部分,分别是 应用层、逻辑层、物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构…

窗函数的总结

1. 为什么要加窗 每次FFT变换只能对有限长度的时域数据进行变换,因此,需要对时域信号进行信号截断。即使是周期信号,如果截断的时间长度不是周期的整数倍(周期截断),那么,截取后的信号将会存在泄…

C++算法初级10——动态规划

C算法初级10——动态规划 文章目录C算法初级10——动态规划最优化问题动态规划分析流程和条件最优化问题 生活中我们常常遇到这样一些问题: 看到上面的例子,我们发现这些问题都是在最大化(或者最小化)某个指标:最小化…

leetcode重点题目分类别记录(三)动态规划深入与素数理论

文章目录动态规划背包问题01背包抽象出求解目标尝试进程子问题拆分基本情况根据拆分过程定义dp数组与转移方程遍历顺序与状态压缩模板归纳题目应用变种提升组合问题多维01背包有特殊限制的01背包完全背包尝试进行子问题拆分转移方程题目应用变种提升-求组合/排列数打家劫舍变种…

二维数组的总结

一、时间复杂度和空间复杂度 时间复杂度和空间复杂度是衡量算法效率的两个重要指标。时间复杂度是指算法执行所需的时间,而空间复杂度是指算法执行所需的内存空间。 计算时间复杂度和空间复杂度需要分析算法中各个操作的执行次数和内存使用情况。具体的计算方法可以…

【matlab代码】提取任意多边形内的nc数据--以海洋温度为例子

【matlab代码】提取任意多边形内的nc数据–以海洋温度为例子 本文来源于对象想提取一个矩形内的温度数据,从而求平均能看出时间序列变化。 由于平时我们矩形是和经纬度平行,我们可以直接使用lon,lat进行寻找。 例子如图: 图片 这样的水平图,大家都会,直接: find(lon…

数据库作业合集

目录[TOC](目录)数据库作业第七章(1)习题7关系模式(2)习题8关系模式数据库作第三章34数据库作第二章6数据库作业第三章59数据库作业第八章(1)统计离散数学的成绩分布情况,即按照各分数段统计人数…

ROS--URDF集成Gazebo仿真小车和rviz结合

ROS–URDF集成Gazebo仿真小车 实现流程: 需要编写封装惯性矩阵算法的 xacro 文件为机器人模型中的每一个 link 添加 collision 和 inertial 标签,并且重置颜色属性在 launch 文件中启动 gazebo 并添加机器人模型工作目录 1.编写封装惯性矩阵算法的 head.xacro 文件…

【MySQL】B+树索引——InnoDB 中的索引方案;MylSAM 中的索引方案 和 InnoDB 中的索引方案 对比

一、InnoDB 中的索引方案 1. 聚簇索引 聚簇索引 有两个特点: 使用记录主键值的大小进行记录和页的排序,这包括3方面的含义. (1)页〈包括叶子节点和内节点〉内的记录按照主键的大小顺序排成一个单向链表,页内的记录被…

MongoDB 介绍和基本操作

一、MongoDB数据库 1、MongoDB是一种非关系型数据库,是用C语言编写的。其特点是高性能、易部署、易使用,存储数据方便。 2、MongoDB特点: 面向集合存储,易于存储对象类型数据;支持动态查询,支持完全索引&…

灌区量测水系统

1)灌区量测水 灌区量测水是水资源管理的基础,是推进节水农业和水价改革的重要手段。常规在主要水闸处,监测闸前和闸后水位及闸门开启状态(闸位),通过实时监测数据,计算过闸流量。要实现全灌区水资源动态配置、精准灌溉&#xff0…

C语言小项目 -- 通讯录完整代码(登陆系统+动态开辟 + 文件操作)

目录 📰0. 项目介绍 📰1. 开发环境及框架 📰2. 通讯录账户模块功能分析实现: 📱2.1 通讯录账户菜单界面及数据结构设计 📱2.2 通讯录账户注册功能实现 📱2.3 通讯录账户登录功能实现 &am…

完美解决丨 - [SyntaxError: invalid syntax](#SyntaxError-invalid-syntax)

目录 报错名称SyntaxError: invalid syntaxNameError: name xx is not definedIndentationError: expected an indented blockAttributeError: xx object has no attribute xxTypeError: xx object is not callableValueError: I/O operation on closed fileOSError: [Errno 2]…