【Android】之【内存管理】

一、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;这个操作有可能会影响到帧率,并使得用户感知到性能问题

四、参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android内存管理是操作系统的关键部分,它可以确保系统资源的高效利用和最佳性能。下面是一些常见的内存管理技术。 1、进程和线程管理:Android使用进程和线程来执行应用程序。每个应用程序都有一个主线程和多个其他线程来执行不同的任务。操作系统管理这些进程和线程,通过调度和优先级管理来确保系统资源的最佳使用。 2、内存映射和虚拟内存:Android使用内存映射和虚拟内存技术来管理内存。内存映射是一种将文件或设备映射到内存中的技术,这样可以快速访问数据。虚拟内存是一种将虚拟地址映射到物理内存的技术,这样可以大大增加可用内存的数量。 3、内存回收和垃圾回收:Android使用内存回收和垃圾回收技术来管理内存。内存回收是一种将不再使用的内存分配回操作系统的技术,这样可以确保系统资源的最佳利用。垃圾回收是一种自动回收不再使用的对象和内存的技术,这样可以避免内存泄漏和内存溢出。 4、内存压缩和交换:Android使用内存压缩和交换技术来管理内存。内存压缩是一种将不常用的内存压缩成更小的空间的技术,这样可以释放更多的内存。交换是一种将内存数据交换到硬盘上的技术,这样可以释放更多的内存空间。 总之,Android内存管理是一个复杂的过程,需要使用多种技术来确保系统资源的高效利用和最佳性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crazy程序猿2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值