`
hylxinlang
  • 浏览: 129172 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android静态变量的生命周期

阅读更多

Android是用Java开发,其静态变量的生命周期遵守Java的设计。我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区。当类被卸载的时候,静态变量被销毁。在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。那么在Android中呢?用的Dalvik vm也是一样的。不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型是无所谓的,如果是静态的对象引用,则与内存回收、内存泄漏这些问题有关,有必要加深研究和理解。 
一、静态变量在类被加载的时候分配内存。 
类在什么时候被加载? 
当我们启动一个app的时候,系统会创建一个进程,此进程会加载一个Dalvik VM的实例,然后代码就运行在DVM之上,类的加载和卸载,垃圾回收等事情都由DVM负责。也就是说在进程启动的时候,类被加载,静态变量被分配内存。 
二、静态变量在类被卸载的时候销毁。 
类在什么时候被卸载? 
在进程结束的时候。 
说明:一般情况下,所有的类都是默认的ClassLoader加载的,只要ClassLoader存在,类就不会被卸载,而默认的ClassLoader生命周期是与进程一致的,本文讨论一般情况。 
三、Android中的进程什么时候结束 
这个是Android对进程和内存管理不同于PC的核心——如果资源足够,Android不会杀掉任何进程,另一个意思就是进程随时可能会被杀掉。而Android会在资源够的时候,重启被杀掉的进程。也就是说静态变量的值,如果不做处理,是不可靠的,可以说内存中的一切都不可靠。如果要可靠,还是得保存到Nand或SD卡中去,在重启的时候恢复回来。 
另一种情况就是不能把退出所有Activity等同于进程的退出,所以在用户点击图标启动应用的时候,以前存放于静态变量中的值,有可能还存在,因此要视具体情况给予清空操作。 
四、Application也是一样不可靠 
Application其实是一个单例对象,也是放在内存中的,当进程被杀掉,就全清空了,只不过Android系统会帮重建Application,而我们存放在Application的数据自然就没有了,还是得自己处理。 
五、静态引用的对象不会被垃圾回收 
只要静态变量没有被销毁也没有置null,其对象一直被保持引用,也即引用计数不可能是0,因此不会被垃圾回收。因此,单例对象在运行时不会被回收. 

分享到:
评论

相关推荐

    Android静态变量的生命周期 简单介绍

    在Android开发中,静态变量的生命周期是一个重要但有时被忽视的概念。由于Android系统与传统的Java桌面应用程序有不同的运行环境,理解静态变量的生命周期对于避免内存泄漏和优化应用性能至关重要。 首先,我们要...

    浅谈Android中关于静态变量(static)的使用问题

    在Android开发中,静态变量(`static`)的使用是一个重要的议题,因为它涉及到应用程序的内存管理、生命周期以及可能引发的问题。下面将详细讨论以下几个方面: 1. **静态变量的生命周期**: - 静态变量在类被加载...

    Android-Application被回收引发空指针异常分析(消灭全局变量

    Android系统的生命周期管理是其独特的一部分,而Application类作为应用程序的全局上下文,它的生命周期贯穿于整个应用程序。开发者常常会将一些全局的、需要在整个应用范围内共享的对象实例化并存储在Application的...

    Android-简化Android组件之间的共享字段和通信以及可识别生命周期的自定义范围

    Android组件主要包括Activity、Service、BroadcastReceiver和ContentProvider,它们各自有特定的生命周期和职责。在实际开发中,我们常常需要在这些组件之间共享数据和进行通信,这通常是通过Intent、Bundle、静态...

    [Java4Android 04_Java的变量

    静态变量的生命周期贯穿整个程序,而非静态变量随着对象的创建而创建,对象消失时变量也会被销毁。 5. 变量的初始化: 变量可以显式初始化,也可以在声明时初始化。如果未初始化就使用,编译器会报错,除非该变量...

    android内存泄露

    1. 静态变量:静态变量生命周期与应用相同,如果静态变量引用了非静态对象,即使对象不再使用,由于静态引用的存在,该对象也无法被回收。 2. 单例模式:单例的生命周期同样贯穿应用始终,如果单例中持有Activity或...

    Android内存优化——常见内存泄露及优化方案.pdf

    关于静态变量导致内存泄露,静态变量的生命周期是从类加载时开始,直到应用程序进程结束。如果静态变量持有了活动或服务的引用,那么即使该活动或服务已经不再需要,但由于静态变量持有引用,它们也无法被系统回收。...

    Android--memory.rar_android_mobile android

    1. 静态变量持有强引用:静态变量生命周期与应用相同,如果持有Activity或其他生命周期短的对象,会导致它们无法被释放。 2. 单例模式:不正确的单例实现可能导致长时间持有对象引用,尤其是当单例持有Context时。 3...

    Chamber,:rocket:使用支持生命周期的自定义作用域简化android组件之间的共享字段和通信。.zip

    传统的解决方案如Intent、Bundle、静态变量或Singleton模式可能存在复杂性高、易出错和难以维护的问题。为了解决这些问题,开源社区推出了一种名为"Chamber"的库,它利用Rocket支持生命周期的自定义作用域,帮助...

    Android编程中全局变量问题分析

    这种方式简单易用,但需要注意的是,静态变量在应用的整个生命周期内都会存在,即使Activity被销毁。当Activity通过`System.exit(0)`强制退出时,静态变量的值可能会丢失,因为这会结束整个应用进程。而使用`finish...

    Android_memory-leak-debugging.pdf.zip_Android memory le_android_

    - 静态变量:静态变量生命周期与应用相同,如果引用的对象不再使用,但静态变量仍然持有其引用,就会导致内存泄漏。 - 单例模式:不恰当的单例实现可能导致长时间保持对对象的引用。 - Handler:Message对象未...

    Android-memroy.zip_android_android 优化

    静态变量在整个应用生命周期内都存在,容易造成内存泄漏。除非必要,否则应尽量避免使用全局静态变量。 6. **使用Intent传递数据** 在组件间传递大量数据时,优先考虑使用Intent的putExtra()方法,而不是创建静态...

    2-1(Activity生命周期).7z

    "2-1(Activity生命周期).7z"这个压缩包文件很可能包含了一个关于Android Activity生命周期的示例程序,用于帮助开发者理解Activity如何在不同状态之间转换。 Activity的生命周期包括几个关键状态:初始化(创建)、...

    android内存优化1

    静态变量生命周期与类加载器相同,直到应用结束才会被释放。例如,在`YouhuaTestActivity`中,静态成员变量`mContext`持有`Activity`的引用,使得`Activity`不能正常地被垃圾回收。为避免这种问题,我们应该使用`...

    Android开发最常见的5大内存泄漏

    静态变量生命周期与应用相同,如果静态变量持有对某个对象的引用,即使该对象不再使用,由于静态变量不会被系统自动回收,因此对象也无法被垃圾回收器清理。解决方法是避免让静态变量长时间持有Activity或Context的...

    80-NJ221-1-REV-B-Android-Memory-Leak-Debug-User-Guide

    4.2 避免静态变量:静态变量生命周期与应用相同,可能导致长时间持有对象。 4.3 关闭资源:在不再使用文件流、数据库连接等资源时,务必及时关闭。 4.4 使用Android的生命周期感知组件,如LiveData和ViewModel,...

    Android 高级开发面试题以及答案 整理

    static 关键字用于修饰静态变量和静态方法,final 关键字用于修饰不可变的变量和方法。 此外,该资料还涵盖了 Android 平台相关的知识点,包括 Android 架构设计、Activity 生命周期、Intent 机制、四大组件、数据...

    Android内存泄漏的八种可能.pdf

    在 Java 中,内存泄漏的原因有很多,包括静态变量、单例模式、广播接收器、handler、线程、匿名内部类、Adapter 和自定义的 View 等。 第一种可能:Static Activity 在 Android 中,Activity 是一个重量级对象,...

Global site tag (gtag.js) - Google Analytics