资讯专栏INFORMATION COLUMN

Android内存优化

hikui / 1251人阅读

摘要:一内存分配内存结构创建进程分配内存块内存块中有堆,栈,静态存储区静态存储区,存放静态数据,全局数据和常量堆,存放对象栈,当进程中创建了线程,分给线程一个栈,用于存放局部变量函数开始执行时,局部变量的存储单元在栈上创建,当函数执行结束,释放这

一.内存分配 1.内存结构

创建进程分配内存块
内存块中有堆,栈,静态存储区
静态存储区,存放静态数据,全局static数据和常量;
堆,存放对象;
栈,当进程中创建了线程,分给线程一个栈,用于存放局部变量;
函数开始执行时,局部变量的存储单元在栈上创建,当函数执行结束,释放这些存储单元;

堆是不连续的,堆的空间比较大,
栈是连续的内存区域,空间比较小

问题:
1)如何给成员变量分配内存?
成员变量全部存储于堆中(包括基本数据类型,对象引用和引用指向的对象实体),因为它们属于类;
2)int i= 1; 1存放在哪里?

2.内存分配的流程

1)申请内存;
2)申请成功,结束;申请失败,GC,再次申请;
3)申请成功,结束;申请失败,增加堆的大小,再次申请;
4)申请成功,结束;申请失败,GC,再次申请;
5)申请成功,结束;申请失败,OOM;

</>复制代码

  1. void* dvmMalloc(size_t size, int flags)
  2. {
  3. void *ptr;
  4. dvmLockHeap();
  5. /* Try as hard as possible to allocate some memory.
  6. */
  7. ptr = tryMalloc(size);
  8. if (ptr != NULL) {
  9. /* We"ve got the memory.
  10. */
  11. if (gDvm.allocProf.enabled) {
  12. Thread* self = dvmThreadSelf();
  13. gDvm.allocProf.allocCount++;
  14. gDvm.allocProf.allocSize += size;
  15. if (self != NULL) {
  16. self->allocProf.allocCount++;
  17. self->allocProf.allocSize += size;
  18. }
  19. }
  20. } else {
  21. /* The allocation failed.
  22. */
  23. if (gDvm.allocProf.enabled) {
  24. Thread* self = dvmThreadSelf();
  25. gDvm.allocProf.failedAllocCount++;
  26. gDvm.allocProf.failedAllocSize += size;
  27. if (self != NULL) {
  28. self->allocProf.failedAllocCount++;
  29. self->allocProf.failedAllocSize += size;
  30. }
  31. }
  32. }
  33. dvmUnlockHeap();
  34. if (ptr != NULL) {
  35. /*
  36. * If caller hasn"t asked us not to track it, add it to the
  37. * internal tracking list.
  38. */
  39. if ((flags & ALLOC_DONT_TRACK) == 0) {
  40. dvmAddTrackedAlloc((Object*)ptr, NULL);
  41. }
  42. } else {
  43. /*
  44. * The allocation failed; throw an OutOfMemoryError.
  45. */
  46. throwOOME();
  47. }
  48. return ptr;
  49. }
  50. static void *tryMalloc(size_t size)
  51. {
  52. void *ptr;
  53. ......
  54. ptr = dvmHeapSourceAlloc(size);
  55. if (ptr != NULL) {
  56. return ptr;
  57. }
  58. if (gDvm.gcHeap->gcRunning) {
  59. ......
  60. dvmWaitForConcurrentGcToComplete();
  61. } else {
  62. ......
  63. gcForMalloc(false);
  64. }
  65. ptr = dvmHeapSourceAlloc(size);
  66. if (ptr != NULL) {
  67. return ptr;
  68. }
  69. ptr = dvmHeapSourceAllocAndGrow(size);
  70. if (ptr != NULL) {
  71. ......
  72. return ptr;
  73. }
  74. gcForMalloc(true);
  75. ptr = dvmHeapSourceAllocAndGrow(size);
  76. if (ptr != NULL) {
  77. return ptr;
  78. }
  79. ......
  80. return NULL;
  81. }
3.Android的内存分配

1)Dalvik虚拟机的内存分配
2)ART的内存分配

二.内存回收-GC 1.Java的GC GC针对的是堆内存; GC的步骤:

1)寻找应该回收的对象;
2)回收对象;

GC算法:

1) 引用计数
2)标记-清除
3)标记-清除-压缩
4)复制
5)增量
6)分代

GC-Roots:程序的主要运行对象,如静态对象/寄存器/栈上指向的内存对象等;
GC-Root可达:从GC-Root开始,通过所持有引用的可以获取到的对象是GC-Root可达的,
剩下的对象是GC-Root不可达的,是GC回收的对象;

2.Android的GC 三.内存问题 内存使用不合理引发的问题: 1.OOM 2.GC过多,影响程序的运行 内存使用不合理 1.内存泄漏

1)GC-Root持有对象的引用,static,final;
2)线程持有对象的引用,造成对象的生命周期同线程的生命周期相同;
3)内部类持有外部类的引用,造成外部类的对象的生命周期与内部类的对象生命周期相同;

2.内存占用较大的对象

1)Bitmap

四.内存检测工具

1.Heap Viewer
2.Allocation

参考:https://www.jianshu.com/p/310...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68131.html

相关文章

  • Android性能优化内存优化

    摘要:导语智能手机发展到今天已经有十几个年头,手机的软硬件都已经发生了翻天覆地的变化,特别是阵营,从一开始的一两百到今天动辄,内存。恰好最近做了内存优化相关的工作,这里也对内存优化相关的知识做下总结。 导语 智能手机发展到今天已经有十几个年头,手机的软硬件都已经发生了翻天覆地的变化,特别是Android阵营,从一开始的一两百M到今天动辄4G,6G内存。然而大部分的开发者观看下自己的异常上报系...

    cheng10 评论0 收藏0
  • 内存 问题- 收藏集 - 掘金

    摘要:然而,中依然有可能发生内存泄漏。所以你的安卓快速定位解决内存泄漏掘金昨天是个好日子,程序员的节日,在这里给所有的程序员送上一份迟到的祝福。应用内存泄漏的定位分析与解决策略掘金,大家好,我是。 Android 性能优化之巧用软引用与弱引用优化内存使用 - Android - 掘金前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱...

    TIGERB 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<