Android 内存浅析【一】【管理、机制、分析】

Android oom机制浅析 本文主要基于android11,整理了android关于 oom killer, lowmemorykiller(lmk lmkd), kswapd的知识,还未深入去分析源码。 目录 linux oom oom_adj、oom_score、oom_score_adj三者的关系 android low memory killer(lmk) android app oom kswapd zRAM kswapd 和lmkd 总结 linux oom 杀进程规则:按优先级,/proc/pid/ 阅读详情

文章内容也行有点多,分开发上来,这篇先说说理论的,下篇咱说android注意的细节的东西。

一、 Android的内存机制

    Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的。C/C++中的内存机制是“谁污染,谁治理”,java的就比较人性化了,给我们请了一个专门的清洁工(GC)。

二、GC是什么? 为什么要有GC?    
    GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

三、垃圾回收的优点和原理。并考虑2种回收机制。 
    Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

四、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 
    对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
 
五、Android系统中GC什么情况下会出现内存泄露呢?  视频编解码/内存泄露 
    导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为null或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。

Java带垃圾回收的机制,为什么还会内存泄露呢?举例:

[java]  view plain copy
  1. Vector v = new Vector(10);  
  2.         for (int i = 1; i < 100; i++) {  
  3.             Object o = new Object();  
  4.             v.add(o);  
  5.             o = null;  
  6.         }// 此时,所有的Object对象都没有被释放,因为变量v引用这些对象。  
Java 内存泄露的根本原因就是 保存了不可能再被访问的变量类型的引用

六、Android的内存溢出
        Android的内存溢出是如何发生的?
        Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。也就是说我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。
为什么会出现内存不够用的情况呢?我想原因主要有两个:
由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制。
Android性能优化之内存优化浅析 一、背景 Android由于是以Java语言为主要开发语言,所以它的内存管理并不像C语言那样由开发者去管理内存的分配以及回收等,而是交由JVM虚拟机的内存回收机制去处理。这就导致我们在开发过程中难免会遇到内存相关的各种问题带来的困扰。而这些问题的根源就在于我们对Android的内存管理机制的不够了解,以及开发过程中缺少对内存的关注导致。所以这里借这篇文章我们再回顾一下Android的内存管理机制,以及如何在开发过程中去尽量避免这些内存问题。 二、内存管理—内存划分 Android中的内... 阅读详情

相关推荐

浅析Kernel中的cache机制

浅析Kernel中的cache机制 内核中的各个子系统都有cache的身影,这篇文章尝试分析一下常用的子系统中所使用的cache机制及实现. 首先,来看一下slab cache: Android 2.X系列的kernel里默认使用的slab allocation. slab cache的思想最初由Jeff Bonwick早Sun OS中诞生(可敬的SUN, 可悲的SUN,

为了工作而工作是悲哀的!工作是实现自我价值的地方! 3063

Android中的内存管理

当进程内存不够的时候,安卓会再分配一些内存给各个进程。回收的时候就可能杀死那些正在占用内存的进程。所以操作系统需要有一个合理的杀死占用内存的进程的机制,以保证把副作用降到最低。安卓系统会为每个进程合理的分配内存,从而保证每个进程能正常运行。这里我们注意,前台进程,可见进程,服务进程,正常情况下他是绝对不会被杀死和回收的。操作系统在内存不足的时候,它会有一个合理的回收和再分配的机制。安卓在开始杀死进程的时候,系统会判断杀死这个进程所带来的效益。3.在系统内存紧张的时候,尽可能多的释放掉一些非重要的资源。

Crazy Android 3171

浅析 Android 内存泄露的本质、原因&解决方案

在 Android 中,内存泄露的现象十分常见;而内存泄露导致的后果会使得应用Crash 本文将全面介绍内存泄露的本质、原因 & 解决方案,最终提供一些常见的内存泄露分析工具,希望你们会喜欢内存泄漏即指 程序在申请内存后,当该内存不需再使用;但却无法被释放&归还给程序的现象本文全面介绍了内存泄露的本质、原因 & 解决方案,希望大家在开发时尽量避免出现内存泄露;为了是大家能够更好的学习Android 相关的知识点,在这里特别提供一份Android 高级开发学习笔记,里面包含了这些年学习。...

m0_62167422的博客 1010

Android性能优化(三)之内存管理

1、初识内存优化 在Android的性能优化的各个部分里,内存的问题绝对是最令人头疼的一部分,虽然Android有垃圾自动回收机制不需要手动干预,但也恰因为此,出现内存问题如内存泄漏和内存溢出等,如果对内存管理机制不熟悉,会更加难以排查问题。 因为内存方面的知识较多且不易理解,内存优化部分就分两篇文章进行,本文主要是关于Java、Android的内存分配、回收、GC等理论知识。 2、内存分配 谈A...

weixin_33997389的博客 379

安卓逆向学习思路流程浅析

一、安卓逆向工程师 含义:安卓逆向工程师实际上是针对安卓手机应用做破解攻击,以达到测试 与逆向调试、安全分析,应用保护的效果。 方向:安卓逆向工程师在日常工作中会利用「反编译工具或手段」对市场上 大量的APP进行破解以加强应用的安全防护; 还有一类人则是通过逆向分析技术,对某些火热的APP进行破解,以 达到快速暴力盈利目的这种行径我们称之为“灰/黑色产业”。 二、技术的基本流程工作形式 App通过...

contrary_的博客 644

浅析Android Binder机制

在Android开发过程中,Binder的身影无处无处不在,我们编写的程序都使用过Binder机制(例如startActivity的执行过程)但是请问你知道什么是Binder么?在开发过程中你察觉到它的存在了么? 什么是Binder Biner翻译过来是“胶水“的意思,这个翻译分形象。Binder的主要工作就是淡化了进程边界,淡化了进程间通信的过程。要是想更好的理解Binder就必须从Lin...

tectrol的专栏 286

Android内存管理

转载请注明出处: 前言 在Android或Java中,我们一般不用担心内存管理,这是因为Java虚拟机(JVM:Java Virtual Machine)存在垃圾回收机制(GC:Garbage Collection),垃圾回收器会对内存进行管理。相比于其它语言(例如C语言),会要求主动释放申请的内存,所以在编程的时候需要考虑内存申请和内存释放的时机。Java GC的存在从一定程度上减少了我们的工作量,但带来的后果就是很多时候我们会滥用内存,比如说申请了一块较大的内存,很少会去关注这块内存何时释放以及如何释放

mythmayor的博客 3989

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 437

【Android】之【内存管理】

Android内存管理及优化知识整理

Crazy程序猿 1126

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1968

Python实战:用Py2neo轻松玩转Neo4j图数据库(附完整CRUD示例)

本文通过构建武侠知识图谱的实战案例,详细介绍了如何使用Python的Py2neo库对Neo4j图数据库进行CRUD操作。内容涵盖环境搭建、节点与关系创建、Cypher查询、数据更新删除及事务管理,帮助开发者直观高效地处理复杂关联数据,实现从入门到进阶的完整交互流程。

weixin_29034963的博客 185

Android 内存管理机制

本文主要包括三大部分内容: 内存管理基础:从整个计算机领域简述主要的内存管理技术。 Linux的内存管理机制:Android毕竟是基于Linux内核实现的操作系统,因此有必要了解一下Linux的内存管理机制。 Android的内存管理相关知识:Android又不同于Linux,它是一个移动操作系统,因此其内存管理上也有自己的特性,这一部分详细讲述Android的内存管理...

未子涵的博客 1万+

宿舍网速跑不满?可能是PPPoE的锅!实测OpenWrt切换DHCP+深澜认证,轻松跑满校园百兆宽带

本文探讨了校园网PPPoE协议的性能瓶颈问题,并提供了通过OpenWrt路由器切换DHCP+深澜认证的技术方案,实测可显著提升网速至百兆宽带满速。文章详细介绍了配置步骤、性能对比及常见问题解决方案,帮助用户优化校园网体验。

weixin_31310913的博客 383

Android 内存浅析【管理、机制、分析】

文章内容也行有点多,分开发上来,这篇先说说理论的,下篇咱说android注意的细节的东西。 一、 Android的内存机制     Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的。C/C++中的内存机制是“谁污染,谁治理”,java的就比较人性化了

老牛比 5353

刷题单向链表

实现一个数据结构,维护一张表(最初只有一个元素 11)。接下来 qq 行,每行表示一次操作,操作具体间题目描述。a[i] 里面放的是下一个元素,为0代表链表结束。如单链表1->4 -> 2->3->0用数组表示是。对于每个操作 2,输出一个数字,用换行隔开。第一行一个整数 qq 表示操作次数。

power的专栏 1714

SNAP实战:哨兵1 SLC数据预处理全流程详解(附避坑指南)

本文详细解析了使用SNAP软件处理哨兵1号SLC数据的完整预处理流程。从轨道精校正、辐射定标到多视与斑点滤波,再到地理编码,文章提供了清晰的操作步骤与核心逻辑,并重点分享了实践中的常见“坑”与解决方案,旨在帮助用户高效、准确地完成SAR数据预处理。

7up55的博客 1027

Android Binder机制浅析

Binder机制听的比较多,在实际的应用中主要是AIDL跨进程通信的实现原理,但是我们平时也很少深入的了解;但是在阅读系统源码的时候尤其是四大组件的启动流程,都和Binder息息相关,APP进程通过Binder和SystemServer进程通信调用ActivityManagerService的方法,经过层层调用之后,SystemServer进程ActivityManagerService的方法又通...

fengluoye2012的博客 625

iOS远程真机之WebDriverAgent 天坑记

一、WDA安装依赖报错:       这个东西神坑,我搞了一天都没找到解决方案,最后在appium讨论中发现,       解决方案是:       先定位到WebDriverAgent 所在路径$ cd /Users/XXXX/git/WebDriverAgent        然后运行:mkdir -p Resources/WebDriverAgent.bundle sh ./Scripts/b

甫式人生 7316

Android的Binder机制浅析

简要分析Android基础应用框架中的主要IPC实现方式Binder的运行机理,以多媒体框架中Surface和MediaPlayerService等为例说明。

quanben 9523

高速PCB设计中的一些常用规则

目前,高速PCB产品设计中,高速接口的应用日益普及,对于复杂的设计而言,高速走线就如同“蜘蛛网”一样密布在PCB各处,因此,在进行PCB检查及评审时,必要的高速PCB设计经验法则及规则是工程师开展工作必不可少的知识储备。

一只豌豆象的博客 3414

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

分析android程序的内存 mat,Android内存优化大盘点

1基础知识1.1 Android内存管理框架:这里针对上图进行简单描述:1)物理地址与虚拟地址:虚拟内存是程序和物理内存之间引入的中间层,目的是解决直接使用物理内存带来的安全性问题、超过物理内存大小需求无法满足等等问题。而Linux的内存管理就是建立在虚拟内存之上的。虚拟地址与物理地址通过页表建立映射关系,CPU通过MMU(Memory Management Unit :内存管理单元)访问页表来查...

weixin_39978444的博客 268

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Android 性能优化】—— 详解内存优化的来龙去脉

APP内存的使用,是评价一款应用性能高低的一个重要指标。虽然现在智能手机的内存越来越大,但是一个好的应用应该将效率发挥到极致,精益求精。本文是【Android 性能优化】系列的第二篇文章,我们在第一篇【Android 性能优化】—— UI篇中主要介绍了Android界面的优化的原理以及方法,这一篇中我们将着重介绍Android的内存优化。本文的篇幅很长,但是请不要嫌烦

大圣代的技术专栏 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

浅析ios为什么比安卓流畅的因素

          不少人都反应苹果iPhone要比一般Android手机流畅,这是一个现象要说是大问题谈不上,毕竟两者是完全两个不同的系统所以严格来说放在一起对比是不公平的。不过因为Android以及iOS是当下两大主流操作系统,对比抗衡之类的说法自然难以避免。今天我们就来谈谈为什么iOS产品在使用过程中会让人觉得更加流畅一些,而为何一些Android手机则容易出现卡顿延迟的情况。 一、开发...

Marmara 7777

全民K歌内存篇2——虚拟内存浅析

于是,ARM采取了折中的策略:在指令集方面允许使用完整的64位地址空间,为后期的扩展提供了充分的支持,而当前的CPU只使用部分地址。使用了304KB的虚拟内存,且已全部映射到物理内存,其中的288KB是干净页,没有修改过的。分页也是内存管理的一种手段,把内存划分一小块一小块的连续空间,每一块我们称之为页,页面是内存分配的最小单位,其大小一般为4KB。的虚拟内存增量为0,这是因为应用启动时就预分配了大量的空间为其所用,当我们在JAVA层分配对象时,会反映在PSS上,需要结合Java dump进一步分析。

chuyouyinghe的专栏 473

android 性能之内存浅析

对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针;对于Java来说,就是new出来的Object 放在Heap上无法被GC回收;本文通过android中内存分配、内存泄漏原因、解决方式以及结合内存泄漏实例来讲讲解内存泄露。

angles的博客 1105
上一篇: 关于屏幕适配的学习(support-screens)
下一篇: Android 内存浅析【二】【泄漏、溢出】
祝福
博客等级 码龄15年 263粉丝 71原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值