android应用对于内存的大小是有限制的,Android 的内存限制

2、单个应用可用的最大内存

Android设备出厂以后,java虚拟机对单个应用的最大内存分配就确定下来了,超出这个值就会OOM。这个属性值是定义在/system/build.prop文件中的

dalvik.vm.heapstartsize=8m

它表示堆分配的初始大小,它会影响到整个系统对RAM的使用程度,和第一次使用应用时的流畅程度。

它值越小,系统ram消耗越慢,但一些较大应用一开始不够用,需要调用gc和堆调整策略,导致应用反应较慢。它值越大,这个值越大系统ram消耗越快,但是应用更流畅。

dalvik.vm.heapgrowthlimit=64m // 单个应用可用最大内存

主要对应的是这个值,它表示单个进程内存被限定在64m,即程序运行过程中实际只能使用64m内存,超出就会报OOM。(仅仅针对dalvik堆,不包括native堆)

dalvik.vm.heapsize=384m//heapsize参数表示单个进程可用的最大内存,但如果存在heapgrowthlimit参数,则以heapgrowthlimit为准.

heapsize表示不受控情况下的极限堆,表示单个虚拟机或单个进程可用的最大内存。而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机(这样设计就会在单个程序崩溃的情况下不会导致整个系统的崩溃)。

注意:在设置了heapgrowthlimit的情况下,单个进程可用最大内存为heapgrowthlimit值。在android开发中,如果要使用大堆,需要在manifest中指定android:largeHeap为true,这样dvm heap最大可达heapsize。

不同设备,这些个值可以不一样。一般地,厂家针对设备的配置情况都会适当的修改/system/build.prop文件来调高这个值。随着设备硬件性能的不断提升,从最早的16M限制(G1手机)到后来的24m,32m,64m等,都遵循Android框架对每个应用的最小内存大小限制,参考http://source.android.com/compatibility/downloads.html 3.7节。

通过代码查看每个进程可用的最大内存,即heapgrowthlimit值:

ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

int memClass = activityManager.getMemoryClass();//64,以m为单位

上面的几个参数是与虚拟机的内存分配相关的,虚拟机的内存分配过程是下面这样的:

1  首先判断一下需要申请的size是不是过大,如果申请的size超过了堆的最大限制,则转入步骤6

2  尝试分配,如果成功则返回,失败则转入步骤3

3  判断是否gc正在进行垃圾回收,如果正在进行则等待回收完成之后,尝试分配。如果成功则返回,失败则转入步骤4

4  自己启动gc进行垃圾回收,这里gcForMalloc的参数是false。所以不会回收软引用,回收完成后尝试分配,如果成功则返回,失败则转入步骤5

5  调用dvmHeapSourceAllocAndGrow尝试分配,这个函数会扩张堆。所以heap startup的时候可以给一个比较小的初始堆,实在不够用再调用它进行扩张

6  进入回收软引用阶段,这里gcForMalloc的参数是ture,所以需要回收软引用。然后调用dvmHeapSourceAllocAndGrow尝试分配,如果失败则抛出OOM。

3、为什么会内存泄露(Memory Leak)?

android通过android虚拟机来管理内存,程序员只管申请内存创建对象,创建完不再需要关心怎么释放对象内存,一切由虚拟机帮你搞定,然而虚拟机回收对象是有条件的。这里简单叙述下java内存管理机制,java虚拟机维护着一张当前对象关系的object tree,当GC发生时,虚拟机会从GC Roots 开始去扫描当前的对象树,发现通过任何reference chain(引用链)无法访问某个对象的时候,该对象即被回收。名词GC Roots正是分析这一过程的起点,例如JVM自己确保了对象的可到达性(那么JVM就是GC Roots),所以GC Roots就是这样在内存中保持对象可到达性的,一旦不可到达,即被回收。通常GC Roots是一个在current thread(当前线程)的call stack(调用栈)上的对象(例如方法参数和局部变量),或者是线程自身或者是system class loader(系统类加载器)加载的类以及native code(本地代码)保留的活动对象。所以GC Roots是分析对象为何还存活于内存中的利器。知道了什么样的对象GC才会回收后,再来学习下对象引用都包含哪些吧。

Java中包含4种对象引用:

强引用: 通常我们编写的代码都是Strong Ref,eg :Person person = new Person("sunny");不管系统资源有多紧张,强引用的对象都绝对不会被回收,即使他以后不再用到。

软引用:只要有足够的内存,就一直保持对象。一般可用来实现缓存,通过java.lang.r.efSoftReference类实现。内存非常紧张的时候会被回收,其他时候不会被回收,所以在使用之前需要判空,从而判断当前时候已经被回收了。

弱引用:通过WeakReference类实现,eg : WeakReference p = new WeakReference(new Person("Rain"));不管内存是否足够,系统垃圾回收时必定会回收。

虚引用:不能单独使用,主要是用于追踪对象被垃圾回收的状态。通过PhantomReference类和引用队列ReferenceQueue类联合使用实现。

我们可能还需要了解shallow size、retained size概念,简单来说,Shallow size就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。在32位系统上,对象头占用8字节,int占用4字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节。故此,对于String对象实例来说,它有三个int成员(34=12字节)、一个char[]成员(14=4字节)以及一个对象头(8字节),总共34 +14+8=24字节。根据这一原则,对String a=”rosen jiang”来说,实例a的shallow size也是24字节。Retained size是该对象自己的shallow size,加上只能从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。为了更好的理解retained size,我们来看个例子。

eb37237939849e7601621e9ad333d65b.png

图1

假设内存中对象之间的引用关系可以看成图1的方式,从图中可以看到 GC正是reference chain的起点。从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。

相信了有以上的这些基础概念,我们应该对java内存管理有了一个初步的了解。

为什么会内存泄露呢,根本原因就是一个永远不会被使用的对象,因为一些引用没有断开,没有满足GC条件,导致不会被回收,这就造成了内存泄露。比如在Activity中注册了一个广播接收器,但是在页面关闭的时候进行unRegister,就会出现内存溢出的现象。如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了,最终就是我们看到的OOM错误。虽然android的内存泄露做到了应用程序级别的泄露(android中的每个应用程序都是独立运行在单独进程中的,每个应用进程都由虚拟机指定了一个内存上限值,一旦内存占用值超过这个上限值,就会发生oom错误,进程被强制kill掉,kill掉的进程内存会被系统回收),但是对于一名开发工程师,绝对不能放过任何的内存泄露。

4、为什么会发生OOM(Out Of Memory)?

OOM:即OutOfMemoery,顾名思义就是指内存溢出了。之前我们知道Android的应用程序所能申请的最大内存都是有限的,OOM是指APP向系统申请内存的请求超过了应用所能有的最大阀值的内存,系统无法再分配多余的空间,就会造成OOM error。在Android平台下,除了之前所说的持续发生了内存泄漏(Memory Leak),累积到一定程度导致OOM的情况以外,也有一次性申请很多内存,比如说一次创建大的数组或者是载入大的文件如图片的时候。实际中很多情况就是出现在图片不当处理加载的时候。

5、常见的MemoryLeak分析

后来看到了更多的MemoryLeak相关的知识,有了更多的实践经验,

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

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

相关文章

winfrom 从网页中通过源代码截取文章

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO;//引用流 using System.Net; using System.Text.RegularExpr…

和平精英android怎么写符号,和平精英名字符号大全 可用的名字特殊符号有哪些...

和平精英名字符号大全&#xff1b;和平精英玩家名可以使用特殊符号使自己的名字与众不同&#xff0c;有哪些特殊符号是可用的呢&#xff1f;下面一起来看看吧。和平精英名字特殊符号大全π-/≤≥≈<>≈≡<>∷∫∮∝∞∧∨⊥‖∠⌒⊙√∟⊿㏒㏑′〃〒&#xffe0;%℃…

android studio课程管理系统,8 个最优秀的 Android Studio 插件

3. Android Drawable Importer为了适应所有Android屏幕的大小和密度&#xff0c;每个Android项目都会包含drawable文件夹。任何具备Android开发经验的开发人员都知道&#xff0c;为了支持所有的屏幕尺寸&#xff0c;你必须给每个屏幕类型导入不同的画板。Android Drawable Imp…

EF – 8.多对多关联

5.6.10 《多对多关联&#xff08;上&#xff09;》 时长&#xff1a;9分57秒 难度&#xff1a;难 5.6.11《多对多关联&#xff08;下&#xff09;》 时长&#xff1a;8分50秒 难度&#xff1a;难 如果单独地把多对多关联的CRUD拿出来讲&#xff0c;确实比较难&#xff0c;但如果…

萌宠历险记html5游戏在线玩,《神武2》天外魔境现世 萌宠历险记首发

在《神武2》古老的传说中&#xff0c;曾经发生过一场未被记载的惨烈战役&#xff0c;据传曾有逆魔肆虐人间&#xff0c;后被三界众神击败并流放天外魔境&#xff0c;传说传到今天已经过去了一千年左右&#xff0c;而天外魔境也几乎无人再次踏入过&#xff0c;但天外魔境却隐藏着…

html实现牌匾效果,4款店面牌匾设计效果图 店铺门头亚克力牌匾样式制作设计图...

4款店面牌匾设计效果图 店铺门头亚克力牌匾样式制作设计图店铺门头亚克力牌匾样式设计很规整自然&#xff0c;同时这种材质也是很受现代人的欢迎&#xff0c;酒红色的色调很自然&#xff0c;醒目的视觉冲击也很不错&#xff0c;中央是点名和logo的设计&#xff0c;再加上图示&a…

html 实现格子效果,div+css实现九宫格效果

divcss实现九宫格效果 有3种方法&#xff1a;1、方法一&#xff1a;把九宫图切割成9张图&#xff0c;用9个div合在一起&#xff0c;改变宽高&#xff0c;实现。优点&#xff1a;兼容性100%支持&#xff0c;缺点div太多&#xff0c;使用不方便。2、方法二&#xff1a;把九宫图按…

如何升级成鸿蒙,如何将自己的华为手机升级成鸿蒙系统

看完6月2号晚上的华为鸿蒙系统发布会&#xff0c;大家肯定都跃跃欲试&#xff0c;想把自己的华为手机升级成鸿蒙系统了是吧&#xff1f;小编我也是迫不及待想要升级&#xff0c;借此机会小编我就和大家说一下&#xff0c;如何将自己的华为手机升级成鸿蒙系统。1、首先打开华为手…

[工具]iperf测试带宽

之前被要求测试网卡带宽能力&#xff0c;发现了iperf这个工具&#xff0c;记录下来防止遗忘。 iperf是个开源跨平台测试带宽工具&#xff0c;windows、linux、macOS……都支持&#xff0c;安装也挺方便。 1.安装 地址&#xff1a;https://iperf.fr/ 2.测试 参看&#xff1a;htt…

计算机能做什么英语对话,计算机英语会话∣实用电脑英语

原标题&#xff1a;计算机英语会话∣实用电脑英语Practical English for Computer实用电脑英语Key sentence必备表达All players must be ready for the game to start.所有玩家准备开始游戏。Are you sure you want to cancel your changes?你确认要取消改变吗&#xff1f;Ar…

Maven学习总结(七)——eclipse中使用Maven创建Web项目

Maven学习总结(七)——eclipse中使用Maven创建Web项目 一、创建Web项目 1.1 选择建立Maven Project 选择File -> New ->Project&#xff0c;如下图所示&#xff1a; 在New窗口中选择 Maven -> Maven Project。点击【next】如下图所示&#xff1a; 1.2 选择项目路径 根…

简单的Flash GUI工具(Simple Flash GUI Tool)

原文引用&#xff1a;http://blog.soulwire.co.uk/code/actionscript-3/simple-flash-prototype-gui-tool#more-1242 简单的Flash GUI工具 40 代码: 用最小的比较快AS3原型 更新:基思自己一直致力于类似的想法,并释放 MinimalConfigurator 。 基思彼得的 最小的组件 任何Flash…

计算机网络模拟校园,计算机网络课程设计-模拟校园网组网实验

计算机网络课程设计-模拟校园网组网实验 福建农林大学金山学院 信息工程类 课程实习报告 课程名称&#xff1a; 计算机网络 实习题目&#xff1a; 校园网组网方案 姓 名&#xff1a; 严夫 系&#xff1a; 信息与机电工程系 专 业&#xff1a; 计算机科学与技术 年 级&#xff1…

计算机网络纳新水粉画,小学教育专业“书法诗画创作社团”顺利举办纳新活动...

原标题&#xff1a;小学教育专业“书法诗画创作社团”顺利举办纳新活动小学教育专业“书法诗画创作社团”顺利举办纳新活动为了丰富同学们的课余生活&#xff0c;向全校师生展现小学教育专业的风采&#xff0c;2018年10月21日上午9:30&#xff0c;隶属于小学教育专业的“书法诗…

理论物理极础3:动力学

莱尼&#xff1a;“乔治&#xff0c;物体咋会运动起来&#xff1f;” 乔治&#xff1a;“因为物体受力&#xff0c;莱尼。” 莱尼&#xff1a;“物体咋会又不动了&#xff1f;” 乔治&#xff1a;“还是因为物体受力&#xff0c;莱尼。” 亚里士多德运动定律 亚里士多德生活在一…

人工神工机器人是什么_为什么企业要用电销机器人代理人工

不管各行各业&#xff0c;只要你有产品有服务&#xff0c;就离不开销售工作。销售工作分哪些&#xff0c;我们可以简单总结&#xff1a;1、人工客服&#xff0c;通过人工处理电话、上门、在线咨询工作。2、销售人员&#xff0c;分析客户名单&#xff0c;主动寻找筛选洽谈客户&a…

树莓派网页服务器的网页留言板,树莓派利用Django搭建聊天网页服务器 —— 准备篇...

利用Django在树莓派上搭建一个聊天网页服务器&#xff0c;话很少说&#xff0c;直接上流程。html首先来看一下刚建立的Django项目文件结构&#xff1a;前端 项目文件配置setting.py配置第一个咱们先来看一下setting.py文件的配置&#xff0c;须要更改两处地方&#xff1a;pytho…

verilog异步复位jk触发器_HDLBits: 在线学习Verilog(Problem 120-126)

这几天在刷HDLBits,参考的是HDLBits中文导学专栏:HDLBits中文导学,刷到120题的时候发现缺少了中间的120题到126题的解析&#xff0c;就打算自己边写边记录一下。也方便其他的同学进行参考。Problem 120 Simple FSM 1s牛刀小试一个很简单的状态机的题目&#xff0c;给定一个输入…

python中字典的value可以为任意对象_Python学习之字典的删改查操作

字典的删改查操作https://www.zhihu.com/video/1185227901603094528字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。字典的每个键值(key>value)对用冒号(:)分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号({})中 。字典是Python语言…

网站服务器商标属于哪类,网络水晶头属于商标哪个类别

水晶头是一种能沿固定方向插入并自动防止脱落的塑料接头&#xff0c;俗称“水晶头”&#xff0c;专业术语为RJ-45连接器(RJ-45是一种网络接口规范&#xff0c;类似的还有RJ-11接口&#xff0c;就是我们平常所用的“电话接口”&#xff0c;用来连接电话线)。之所把它称之为“水晶…