摘要:一内存分配内存结构创建进程分配内存块内存块中有堆,栈,静态存储区静态存储区,存放静态数据,全局数据和常量堆,存放对象栈,当进程中创建了线程,分给线程一个栈,用于存放局部变量函数开始执行时,局部变量的存储单元在栈上创建,当函数执行结束,释放这
一.内存分配 1.内存结构
创建进程分配内存块
内存块中有堆,栈,静态存储区
静态存储区,存放静态数据,全局static数据和常量;
堆,存放对象;
栈,当进程中创建了线程,分给线程一个栈,用于存放局部变量;
函数开始执行时,局部变量的存储单元在栈上创建,当函数执行结束,释放这些存储单元;
堆是不连续的,堆的空间比较大,
栈是连续的内存区域,空间比较小
问题:
1)如何给成员变量分配内存?
成员变量全部存储于堆中(包括基本数据类型,对象引用和引用指向的对象实体),因为它们属于类;
2)int i= 1; 1存放在哪里?
1)申请内存;
2)申请成功,结束;申请失败,GC,再次申请;
3)申请成功,结束;申请失败,增加堆的大小,再次申请;
4)申请成功,结束;申请失败,GC,再次申请;
5)申请成功,结束;申请失败,OOM;
</>复制代码
void* dvmMalloc(size_t size, int flags)
{
void *ptr;
dvmLockHeap();
/* Try as hard as possible to allocate some memory.
*/
ptr = tryMalloc(size);
if (ptr != NULL) {
/* We"ve got the memory.
*/
if (gDvm.allocProf.enabled) {
Thread* self = dvmThreadSelf();
gDvm.allocProf.allocCount++;
gDvm.allocProf.allocSize += size;
if (self != NULL) {
self->allocProf.allocCount++;
self->allocProf.allocSize += size;
}
}
} else {
/* The allocation failed.
*/
if (gDvm.allocProf.enabled) {
Thread* self = dvmThreadSelf();
gDvm.allocProf.failedAllocCount++;
gDvm.allocProf.failedAllocSize += size;
if (self != NULL) {
self->allocProf.failedAllocCount++;
self->allocProf.failedAllocSize += size;
}
}
}
dvmUnlockHeap();
if (ptr != NULL) {
/*
* If caller hasn"t asked us not to track it, add it to the
* internal tracking list.
*/
if ((flags & ALLOC_DONT_TRACK) == 0) {
dvmAddTrackedAlloc((Object*)ptr, NULL);
}
} else {
/*
* The allocation failed; throw an OutOfMemoryError.
*/
throwOOME();
}
return ptr;
}
static void *tryMalloc(size_t size)
{
void *ptr;
......
ptr = dvmHeapSourceAlloc(size);
if (ptr != NULL) {
return ptr;
}
if (gDvm.gcHeap->gcRunning) {
......
dvmWaitForConcurrentGcToComplete();
} else {
......
gcForMalloc(false);
}
ptr = dvmHeapSourceAlloc(size);
if (ptr != NULL) {
return ptr;
}
ptr = dvmHeapSourceAllocAndGrow(size);
if (ptr != NULL) {
......
return ptr;
}
gcForMalloc(true);
ptr = dvmHeapSourceAllocAndGrow(size);
if (ptr != NULL) {
return ptr;
}
......
return NULL;
}
3.Android的内存分配
1)Dalvik虚拟机的内存分配
2)ART的内存分配
1)寻找应该回收的对象;
2)回收对象;
1) 引用计数
2)标记-清除
3)标记-清除-压缩
4)复制
5)增量
6)分代
GC-Roots:程序的主要运行对象,如静态对象/寄存器/栈上指向的内存对象等;
GC-Root可达:从GC-Root开始,通过所持有引用的可以获取到的对象是GC-Root可达的,
剩下的对象是GC-Root不可达的,是GC回收的对象;
1)GC-Root持有对象的引用,static,final;
2)线程持有对象的引用,造成对象的生命周期同线程的生命周期相同;
3)内部类持有外部类的引用,造成外部类的对象的生命周期与内部类的对象生命周期相同;
1)Bitmap
四.内存检测工具1.Heap Viewer
2.Allocation
参考:https://www.jianshu.com/p/310...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68131.html
摘要:导语智能手机发展到今天已经有十几个年头,手机的软硬件都已经发生了翻天覆地的变化,特别是阵营,从一开始的一两百到今天动辄,内存。恰好最近做了内存优化相关的工作,这里也对内存优化相关的知识做下总结。 导语 智能手机发展到今天已经有十几个年头,手机的软硬件都已经发生了翻天覆地的变化,特别是Android阵营,从一开始的一两百M到今天动辄4G,6G内存。然而大部分的开发者观看下自己的异常上报系...
摘要:然而,中依然有可能发生内存泄漏。所以你的安卓快速定位解决内存泄漏掘金昨天是个好日子,程序员的节日,在这里给所有的程序员送上一份迟到的祝福。应用内存泄漏的定位分析与解决策略掘金,大家好,我是。 Android 性能优化之巧用软引用与弱引用优化内存使用 - Android - 掘金前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱...
阅读 2760·2021-11-23 09:51
阅读 1737·2021-11-22 13:54
阅读 2897·2021-11-18 10:02
阅读 1016·2021-08-16 10:57
阅读 3653·2021-08-03 14:03
阅读 1947·2019-08-30 15:54
阅读 3599·2019-08-23 14:39
阅读 702·2019-08-23 14:26