美文网首页
Android 性能优化--内存优化

Android 性能优化--内存优化

作者: Mr_不靠谱_先森 | 来源:发表于2017-07-24 12:56 被阅读22次

内存

  • 寄存器 Registers
    速度最快的存储场所,因为寄存器位于处理器内部,程序中我们无法控制
  • 栈 stack
    存放基本类型的对象和引用,对象本身不存放在栈中 而是存放在堆中

变量其实是分为两部分的:一部分叫变量名,另外一部分叫变量值,对于局部变量(基本类型的变量和对象的引用变量)而言,统一都存放在栈中,但是变量值中存储的内容就有在一定差异了:Java中存在8大基本类型,他们的变量值中存放的就是具体的数值,而其他的类型都叫做引用类型(对象也是引用类型,你只要记住除了基本类型,都是引用类型)他们的变量值中存放的是他们在堆中的引用(内存地址)

在函数执行的时候,函数内部的局部变量就会在栈上创建,函数执行结束的时候这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中是一块连续的内存区域,效率很高,速度快,但是大小是操作系统预定好的所以分配的内存容量有限。

  • 堆 heap
    在java中堆用于存放new创建的对象和数组,堆中分配的内存,由java虚拟机自动垃圾回收器(GC garbage collection)来管理,堆是不连续的内存区域(因为系统是用链表来存储空闲内存地址,自然不是连续的),堆大小受限于计算机系统中有效的虚拟内存(32bit系统理论上是4G)

  • 静态存储区/方法区(Static Field)
    是指在固定的位置上存放应用程序运行时一直存在的数据,java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量

  • 常量池(Constant Pool)
    顾名思义专门存放常量的。注意 String s = "java"中的“java”也是常量。JVM虚拟机为每个已经被转载的类型维护一个常量池。常量池就是该类型所有用到地常量的一个有序集合包括直接常量(基本类型,String)和对其他类型、字段和方法的符号引用

总结

  • 定义一个局部变量的时候,java虚拟机就会在栈中为其分配内存空间,局部变量的基本数据类型和引用存储于栈中,引用的对象实体存储于堆中。因为它们属于方法中的变量,生命周期随方法而结束。
  • 成员变量全部存储与堆中(包括基本数据类型,引用和引用的对象实体),因为它们属于类,类对象终究是要被new出来使用的。当堆中对象的作用域结束的时候,这部分内存也不会立刻被回收,而是等待系统GC进行回收。
  • 所谓的内存分析,就是分析Heap中的内存状态。

相关文章

网友评论

      本文标题:Android 性能优化--内存优化

      本文链接:https://www.haomeiwen.com/subject/ujznhxtx.html