Dalvik内存管理
Dalvik内存:
1.系统堆/外部堆(External heap)/CRT堆(Java方法调用栈/Java函数调用栈/...)----malloc/calloc/realloc/free
OS系统启动本地程序->创建CRT(包括堆)->入口函数
2.系统栈(Dalvik函数调用栈)
系统创建:SP指针
3.GC堆(系统申请内存,dl组织成GC堆)----dvmMalloc/垃圾回收----Dalvik启动创建/关闭释放
启动:创建一个GC堆(GCHeap),其包含3个堆,常用第一个堆
(1)dvmAllocRegion():向系统申请一块映射过的内存,交给dl管理
(2)createMspace:交给dl管理---只用系统分配的一半以便扩充
(3)mspace_malloc:在dl内存(空间)上创建一个GC堆(包括GC堆的管理数据)
4.方法区/线性内存(Linear)(ClassObject的实体数据)----dvmLinearAlloc/dvmLinearFree----Dalvik启动创建/关闭释放
向系统申请一块映射过的内存,直接组织成Linear内存......只读且线性
--------------------------------------------------------------------------------
GC堆位图:每一位对应堆中8字节内存
(1)活对象位图(liveBits)
(2)标记位图(markBits)
--------------------------------------------------------------------------------
创建对象(dvmHeapSourceAlloc):(标志位flags:ALLOC_DEFAULT,ALLOC_DONT_TRACK,ALLOC_FINALIZABLE)
(1)dlmalloc在GC堆上:分配内存,设置liveBits
(2)处理flags标志位(ALLOC_DEFAULT:放入track引用表,ALLOC_DONT_TRACK:无,ALLOC_FINALIZABLE:放入finalizable引用表)
(3)(若有引用)赋值给引用
--------------------------------------------------------------------------------
垃圾回收(dvmCollectGarbageInternal):Mark-Sweep
(1)标记(Mark):扫描引用表和调用栈,设置markBits
(1)标记根集(RootSet):需要递归扫描的放入标记栈(MarkStack)
System classes defined by root classloader
For each thread:
Interpreted stack, from top to "curFrame"
Dalvik registers (args + local vars)
JNI local references
Automatic VM local references (TrackedAlloc):跟踪放入的引用(如果想跟踪某个Java对象可以调dvmAddTrackedAlloc,放入跟踪引用表)
Associated Thread/VMThread object
ThreadGroups (could track & start with these instead of working
upward from Threads)
Exception currently being thrown, if present
JNI global references
Interned string table
Primitive classes
Special objects
gDvm.outOfMemoryObj
Objects allocated with ALLOC_NO_GC
Objects pending finalization (but not yet finalized):待finalize引用表
Objects in debugger object registry
(2)递归扫描标记栈(MarkStack)
(2)处理Finalize表
(3)清除(Sweep):比较liveBits和markBits,清除没有标记的对象(dvmHeapSourceFreeList:清除位图,释放内存)
--------------------------------------------------------------------------------
Dalvik不支持SoftReference/WeakReference/PhantomReference,全部当成强引用,GC时先清空这3个引用表(但如果不清空还是有相应的管理函数存在),但Java层面并不知道
SoftReference/WeakReference/PhantomReference都继承自Reference类(强引用)
--------------------------------------------------------------------------------
但同时Dalvik保留了SoftReference/WeakReference/PhantomReference的支持代码
1.Mark标记时不会扫描(全局)软/弱/虚引用表
2.如果注释掉这3行代码,打开软/弱/虚引用支持
gcHeap->softReferences = NULL;
gcHeap->weakReferences = NULL;
gcHeap->phantomReferences = NULL;
则在Sweep之前:
(1)SoftRefs:如果内存不足,软引用表中引用清空(NULL),否则补充标记软引用表所有引用----或者删除
(2)WeakRefs:弱引用表中引用清空(NULL)-----直接删除
(3)PhantomRefs:虚引用表中引用清空(NULL)----直接删除
--------------------------------------------------------------------------------
finalizable引用表:对象如果有finalize方法,创建时会被放入(全局)finalize引用表,扫描根集后(Sweep前),finalize表中未标记对象放入pendingFinalize待finalize表,留给HeapWorker线程处理
Dalvik创建一个HeapWorker线程,每隔一段时间处理 待finalize表(从待fianlize表依次取出并临时放入线程局部引用表,调用finalize方法,取出线程局部引用表----下次不会被扫描到----被GC)
--------------------------------------------------------------------------------
android dalvik vm alloc
Dalvik内存管理相关推荐
- android 播放英强博客,Android内存管理、监测剖析
Android内存管理机制 Android内存管理主要有:LowMemory Killer机制,Ashmem,PMEM/ION及Native内存和Dalvik内存管理管理和JVM垃圾回收机制. Low ...
- Android 内存管理 amp;Memory Leak amp; OOM 分析
1.Android 流程管理&内存 Android主要应用在嵌入式设备其中.而嵌入式设备因为一些众所周知的条件限制,通常都不会有非常高的配置,特别是内存是比較有限的. 假设我们编写的代 码其中 ...
- Android之内存管理-内存监测-内存优化
推荐文章:Android进程与内存及内存泄漏 Android之内存管理 1.1 Dalvik Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础.其指令集基于寄存 ...
- Android 内存管理 Memory Leak OOM 分析
转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...
- Android官方开发文档Training系列课程中文版:APP的内存管理
写在开头的话: 如果有同学对Android性能比较关注的,可以阅读这篇文章:Android性能优化建议 原文地址:http://android.xsoftlab.net/training/articl ...
- Android内存管理-SoftReference的使用
Android内存管理-SoftReference的使用 发布时间:2010-09-15 作者:Android开发网原创 很多时候我们需要考虑Android平台上的内存管理问题,Dalvik VM给每 ...
- iOS 的内存管理和虚拟内存机制具体是怎么运作的?
iOS 的内存管理和虚拟内存机制具体是怎么运作的? 众所周知,iOS 设备的内存普遍较小.但就最终用户体验而言,流畅舒服.想知道虚拟内存在其中是否发挥了作用? 3 条评论 分享 按投票排序按时间排序 ...
- Android 内存管理之优化建议
OOM(OutOfMemory)转:http://hukai.me/android-performance-oom/ 前面我们提到过使用getMemoryClass()的方法可以得到Dalvik He ...
- davlik虚拟机内存管理之一——内存分配
dalvik虚拟机是Google在Android平台上的Java虚拟机的实现,内存管理是dalvik虚拟机中的一个重要组件. 从概念上来说,内存管理的核心就是两个部分:分配内存和回收内存.Java语言 ...
最新文章
- Java线程同步机制synchronized关键字的理解
- 关于C语言运算符优先级的记忆技巧是什么?
- DHCP和DNS的概念—Vecloud微云
- 使用ganglia监控hadoop及hbase集群
- 干货|吴恩达Coursera课程教你学习神经网络二!
- CAutoupdater通用 自动升级组件用户手册
- springboot实现快速整合mybatis+mysql
- mysql查询配置变量
- python小爬虫,爬取文章(知乎专栏)片段
- html选择日期的组件,怎样实现一个datePicker(日期选择)组件
- antd使用g2plot统计图表(7)
- 破解压缩包、pdf、word 密码【Hashcat + john the ripper】
- 将视频作为网站背景html,将视频作为网页背景
- 2029年会实现通用人工智能吗?
- openjpeg:jpeg2000(j2k)图像内存压缩编码
- 制作U盘CDLinux使用奶瓶进行网络抓包
- Matlab/Simulink中PMSM模型的反电动势系数和转矩系数
- java开发必须安装jre吗_安装jdk后还需要安装jre吗
- iOS 8 Auto Layout界面自动布局约束
- 校内计算机技能考核,校内专业技能达标认证.PDF
热门文章
- CSS3知识点整理(三)----变形与动画
- shell (check return of each line)(PIPESTATUS[@])and sudoer
- 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆
- PHP程序员的技术成长规划(转载)
- Delphi2009下编译提示“无法找到“Excel_TLB”
- 7.串口操作之API篇 GetCommMask SetCommMask WaitCommEvent
- SQL Server 2008 R2 中不能删除复制(replication) 的解决方法
- Mustache 中的html转义问题处理
- [HAOI2007] 理想的正方形 (单调队列)
- SVN专题(Visual SVN Server + TortoiseSVN + Visual SVN)