一、Android内存运行是如何运行的?
物理内存即移动设备上的ram,当启动一个android程序时,会启动一个dalvik vm进程,系统会给它分配固定的内存空间【16m,32m,64m,不定,没有统一标准,每个虚拟机会有堆内存阈值限制(值得一提的是这个阈值一般都由厂商依据硬件配置及设备特性自己设定它的配置是在Android的属性系统的/system/build.prop中配置dalvik.vm.heapsize=128m即可】,这块内存空间会映射到ram上某个区域。ART 和 Dalvik 虚拟机使用分页和内存映射来管理内存。 然后这个android程序就会运行在这块空间上。java里会将这块空间分成stack栈内存和heap堆内存。stack里存放对象的引用,heap里存放实际对象数据。
在程序运行中会创建对象,如果未合理管理内存,比如不及时回收无效空间就会造成内存泄露,严重的话可能导致使用内存超过系统分配内存,即内存溢出oom,导致程序卡顿甚至直接退出。
二、Java运行时内存
Java内存区域是指Java虚拟机所管理的内存区域,通常包括以下几个部分:
-
堆(Heap):是Java虚拟机中最大的一块内存区域,用于存放Java对象实例。Heap通常被所有线程共享,所有新创建的对象都会被放到Heap中,由Java垃圾回收器对其进行管理和清理。Heap内存大小的设定可以通过JVM启动参数进行控制。
-
栈(Stack):是每个线程私有的一块内存区域,用于存放线程执行时的方法调用栈。每当一个方法被调用时,就会创建一个栈帧,栈帧包括了方法的参数、局部变量等信息,栈帧在方法执行结束后会被弹出。
-
方法区(Method Area):用于存储已加载的类的信息(包括类名、字段、方法信息等),所有线程共享。方法区也称为永久代(PermGen),之所以称为“永久代”,是因为这部分内存通常不会被回收,直到JVM进程退出。
-
程序计数器(PC Register):用于记录线程执行的位置信息,每个线程都有一个PC Register,当线程执行Java方法时,程序计数器记录的是虚拟机字节码指令的地址。而当线程执行本地方法时,程序计数器的值为undefined。
-
本地方法栈(Native Method Stacks):与Java栈非常相似,但用于执行本地方法时的方法调用栈。
-
直接内存(Direct Memory):Java NIO中的一种内存区域,是一种堆外内存,可以通过ByteBuffer等类使用。直接内存虽然不受Java虚拟机直接管理,但它仍然被操作系统和CPU的内存管理单元进行管理和访问。
总的来说,Java内存区域是Java虚拟机中内存管理的核心部分,程序员可以通过了解和掌握Java内存区域的规则和使用方式,有效地提升Java程序的性能和稳定性。
三、内存优化问题
Android中关于内存优化的问题主要包括三个方面:
1、 Memory Leaks 内存泄漏
2、 OutOfMemory 内存溢出
3、Memory Churn 内存抖动
Memory Leaks 内存泄漏
内存泄漏(Memory
Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
● 内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测;因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃
● 随着计算机应用需求的日益增加,应用程序的设计与开发也相应的日趋复杂,开发人员在程序实现的过程中处理的变量也大量增加,如何有效进行内存分配和释放,防止内存泄漏的问题变得越来越突出
● 例如服务器应用软件,需要长时间的运行,不断的处理由客户端发来的请求,如果没有有效的内存管理,每处理一次请求信息就有一定的内存泄漏;这样不仅影响到服务器的性能,还可能造成整个系统的崩溃;因此,内存管理成为软件设计开发人员在设计中考虑的主要方面
out of memory内存溢出
out of memory英文意思是电脑内存不足,我们都清楚,电脑程序的运行不仅仅对电脑CPU进行消耗,同时对内存也会进行占用,当占用到一定存度就会出现内存不足的情况,这时电脑系统就会出现out of memory错误提示,那么哪些情况会出现out of memory情况呢
● 运行的程序相对占用内存较多,出现这种情况大多是一些特别大型的程序,例如3DsMax,Maya
● 电脑打开的程序过多,这样因程序过多点用的内存资源过多也会出现out of memory问题
● 电脑病毒感染,如果电脑中毒了,这时大量的内存被病毒点用掉了,这时同样会出现out of memory提示信息
● 电脑设置不正确或电脑程序运行配置不正确
Memory Churn内存抖动
内存抖动是因为大量的对象被创建又在短时间内马上被释放
● 瞬间产生大量的对象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,也会触发GC
● 即使每次分配的对象占用了很少的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC;这个操作有可能会影响到帧率,并使得用户感知到性能问题
四、参考
-
内存指的是什么?一文带你了解Android的内存优化
-
Android性能优化:手把手带你全面了解 内存泄露 & 解决方案
-
Android 虚拟机、对象、变量的内存分配
-
Android性能调优篇之探索JVM内存分配
-
android studio profiler 内存分析用法【官网】
-
Android 从内存模型深究内存优化本质
-
深入理解Java虚拟机——Java内存区域
-
内存优化 · 基础论 · 初识Android内存优化
-
Android内存优化深入解析