`
zeroblue
  • 浏览: 46914 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android中的内存管理

阅读更多


先从我们刚接触Android的一些疑惑开始:

1. 我们退出了全部Activity后,应用还在后台运行。为什么不能真正的退出应用?

2. 似乎线程也能完成service的功能,为什么不能用线程代替service?


要回答第一个问题,就要从Android的内存管理机制说起。

Android的内存管理有一些不同寻常,如同Java或.net,Android有自己的运行时状态和虚拟机(Dalvik)去管理程序内存。但不像其它框架(比如Java,程序打开时该程序的进程开始,程序退出时该程序的进程也就结束),android同时也管理进程的生命周期。Android会通过停止或杀死低优先级的进程来确保高优先级的进程能够正常工作。换句话说进程的清理是由Android说了算的,它会在系统遭遇性能瓶颈时去杀死低优先级的进程以确保系统和高优先级进程能够正常运行,而不是简单的程序退出后该程序的进程也同进结束。在Android中如果系统有足够的可用内存,那么应用的进程就不会被销毁,效果就是你在重新运行该应用时速度会很快。

 

每一个Android的应用都运行在一个独立的进程和虚拟机实例中,所有的应用进程都由Android运行时环境进行统一管理(在需要的时候停止或杀死某个进程)。

 

前面提到了一个概念:进程的优先级。Android进程的优先级主要划分为:活动进程或前台进程(Foreground)、可见进程、已启动的服务进程(Service)、后台进程、空进程。其中前台进程优先级最高,空进程优先级最低。文章最后附有所有进程优先级的详细解释。

 

那么现在我们来回答第二个问题:为什么应用中启动的后台线程不能代替Service。

一个应用变为不可见后(比如所有Activity都退出)就会从可见进程变为后台进程,如果系统没有足够的内存去运行更高优先级的进程,后台进程就很有可能被销毁。在应用中启动的线程其实是由应用进程派生的,如果应用进程被销毁那么其派生的所有线程也会一并被销毁。通过前面关于进程优先级的介绍我们可以见到,服务进程的优先级大于后台进程。事实上服务进程(Service)会被看做前台进程,有很高的优先级,除非前台进程或和用户交互的可见进程没有内存可用,服务进程是不会被销毁的。

 

说到这里我们应该已经明白了,我们的应用一旦变为后台进程,那么当内存告急时,我们的应用进程很可能被销毁以释放内存给更高优先级的进程,其派生的线程也当然一并被销毁。所以有可能你在应用中启动的想长时间运行的一个后台线程莫名其妙的就消失了。但Service有很高的优先级,一般不会发生这种情况。

 

当然Service还有其它的作用,比如进程间通信和其封装的一些功能,生命周期管理等。那是另外一个话题了。

 

附:进程优先级说明:

 

Active Processes Active (foreground) processes are those hosting applications with components currently interacting with the user. These are the processes Android is trying to keep responsive by reclaiming resources. There are generally very few of these processes, and they will be killed only as a last resort.

Active processes include:

  • Activities in an “active” state; that is, they are in the foreground and responding to user events. You will explore Activity states in greater detail later in this chapter.
  • Activities, Services, or Broadcast Receivers that are currently executing an onReceive event handler.
  • Services that are executing an onStart, onCreate, or onDestroy event handler.

Visible Processes Visible, but inactive processes are those hosting “visible” Activities. As the name suggests, visible Activities are visible, but they aren’t in the foreground or responding to user events. This happens when an Activity is only partially obscured (by a non-full-screen or transparent Activity). There are generally very few visible processes, and they’ll only be killed in extreme circumstances to allow active processes to continue.

Started Service Processes Processes hosting Services that have been started. Services support ongoing processing that should continue without a visible interface. Because Services don’t interact directly with the user, they receive a slightly lower priority than visible Activities. They are still considered to be foreground processes and won’t be killed unless resources are needed for active or visible processes.

Background Processes Processes hosting Activities that aren’t visible and that don’t have any Services that have been started are considered background processes. There will generally be a large number of background processes that Android will kill using a last-seen-first-killed pat- tern to obtain resources for foreground processes.

Empty Processes To improve overall system performance, Android often retains applications in memory after they have reached the end of their lifetimes. Android maintains this cache to improve the start-up time of applications when they’re re-launched. These processes are rou- tinely killed as required.

 

 

1
3
分享到:
评论

相关推荐

    android可用内存的阀值教程,让你更了解android的内存管理参照.pdf

    以下是关于Android内存管理的深入解析: 1. **进程分类**: - **前台进程(Foreground)**:正在用户交互界面中显示或关键系统进程,如Dialer、Storage、Google Search等,具有最高优先级,一般不会被系统自动结束...

    面向Android系统的动态内存管理策略.pdf

    然而,由于Android系统将存储子系统全部放在Linux用户空间内,导致其无法直接获得大块连续物理内存,这就需要在Linux内存管理中增加PMEM(physical memory)管理区来解决这个问题。 PMEM管理机制的提出正是为了解决...

    android应用内存监控工具

    在Android应用开发中,内存管理是一项至关重要的任务,因为它直接影响到应用的性能、稳定性和用户体验。内存监控工具能够帮助开发者检测和分析应用的内存使用情况,预防和解决内存泄漏等问题。"Emmagee.apk"可能是一...

    Android内存管理小结

    ### Android内存管理知识点总结 #### 一、Dalvik虚拟机及其优势 - **Dalvik虚拟机简介**:Dalvik虚拟机是Android系统的核心组件之一,它负责执行Android应用中的Java字节码。与传统的Java虚拟机(JVM)不同,Dalvik...

    Android Native 内存泄漏系统化解决方案

    在 Android 平台上,C++ 内存泄漏问题的分析和定位一直是困扰开发人员的难题,因为地图渲染、导航等核心功能对性能要求很高,高德地图 APP 中存在大量的 C++ 代码。解决这个问题对于产品质量尤为重要和关键,高德...

    Unity调用Android查看内存信息2

    高FPS是保证游戏流畅性的关键,而内存管理则直接影响了游戏的稳定性和资源效率。监控和控制内存占用有助于预防因内存泄漏导致的游戏卡顿或崩溃。通过Unity与Android的交互,开发者可以实时获取性能指标,及时调整...

    Android中内存加载dex

    6. ** 内存管理**:加载.dex文件需要内存资源,Android使用垃圾回收机制来管理内存,防止内存泄漏。当不再需要某个类或方法时,它们会被回收,释放内存。 7. ** 动态加载dex**:除了常规的应用安装流程,Android还...

    M8 android dump内存工具

    在Android系统中,内存分析是调试和优化应用性能的关键步骤。M8 android dump内存工具是一个专为M8设备设计的工具,它可以帮助开发者获取设备内存的状态信息,以便于诊断内存泄漏、性能瓶颈等问题。本文将详细讲解这...

    Android处理内存泄漏的代码例子

    在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存...记住,良好的内存管理是提升应用性能和稳定性的重要因素。

    Android3.0内存管理机制分析.pdf

    《Android 3.0内存管理机制分析》这篇文章深入探讨了Android 3.0操作系统中的内存管理机制,该机制是基于Linux 2.6内核进行优化的。文章着重阐述了在这一版本中内存管理的新技术和改进策略。 Android操作系统由系统...

    android低内存管理策略

    #### 一、Android内存管理概览 Android操作系统以其高度定制化和优化的特性,尤其在资源有限的移动设备上表现出色。其内存管理机制是确保系统流畅运行的关键之一。不同于传统的Linux OOM(Out Of Memory)杀手机制...

    使用Android Studio检测内存泄露(LeakCanary)

    理解Android的内存管理机制和熟练使用这些工具,是提高应用性能和稳定性的重要一环。定期进行性能测试和内存分析,可以帮助开发者发现并修复潜在的问题,提升用户体验。记住,良好的编程习惯和对内存管理的深入理解...

    androidStudio内存泄漏分析

    在Android应用开发中,内存泄漏是一个严重的问题,它可能导致应用性能下降、响应变慢甚至崩溃。Android Studio作为官方推荐的集成开发...实践中,结合代码审查和持续的测试,可以确保应用在内存管理方面达到最佳状态。

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    Android MAT 内存分析 工具

    **五、MAT与Android内存优化** MAT在Android开发中的应用主要是查找和修复内存泄漏,优化对象生命周期管理,减少内存占用,提升应用性能。开发者应定期进行内存分析,特别是在处理大量数据或长时间运行的应用中。 ...

    android模拟内存分配

    在Android系统中,内存管理是优化应用程序性能和稳定性的重要环节。操作系统作业,特别是模拟内存分配与分区回收,是理解整个系统运行机制的关键。本文将深入探讨Android中的内存分配策略及其在实际操作中的应用。 ...

    android模拟内存分配与回收

    本教程将深入探讨这两种算法——循环首次适应算法(First Fit)和最佳适应算法(Best Fit),以及它们在Android内存管理中的应用。 循环首次适应算法是一种简单的内存分配策略。当一个进程请求内存时,系统会从内存...

    android 轻松避免内存溢出

    在Android开发中,内存管理是至关重要的,尤其是处理图片资源时,经常遇到内存溢出(Out Of Memory,简称OOM)的问题。本项目提供了一个在Android 1.6 SDK环境下编写的工具类,旨在帮助开发者有效地避免内存溢出,...

Global site tag (gtag.js) - Google Analytics