Android--慎用static静态变量

Java中静态变量Static的加载和Static垃圾回收 静态变量在类加载时被初始化,只初始化一次。 静态变量的生命周期与类的生命周期相同,除非类被卸载或JVM退出,否则它们不会被释放。 静态变量不会被垃圾回收器回收,因为它们与类本身关联而不是与对象实例关联。 阅读详情

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中关于静态变量(static)的使用问题 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错。初步排除了oom和cpu紧张问题,因为是工业平板不方便调试,用了些比较笨的方法最后锁定在几个用了static的地方。在这里记录下Android中使用static的一些问题。 静态变量的生命周期遵守Java的设计。静态变量在类被load的时候分配内存,并存在于方法区。当类被卸载时,静态变量被销毁。在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。在Android中,用的DVM也是一样的,不过Android中不太突出进程的概念,所以对静态变量的生命周期就是感觉模糊,这种模糊对于值类型是无所谓的,如 立即下载

相关推荐

告别Keil手动分区!用CubeMX+VS Code一键生成带Bootloader的STM32 OTA工程

本文详细介绍了如何利用STM32CubeMX和VS Code实现STM32 OTA工程的自动化构建,告别传统Keil手动分区的繁琐流程。通过图形化配置Flash分区、自动生成链接脚本以及实现Bootloader跳转逻辑,开发者可以高效完成远程升级功能开发,显著提升嵌入式开发效率。

weixin_33720956的博客 389

Android静态变量的生命周期

Android是用Java开发,其静态变量的生命周期遵守Java的设计。我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区。当类被卸载的时候,静态变量被销毁。在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。那么在Android中呢?用的Dalvik vm也是一样的。不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊

ctcwri的专栏 3万+

用LangFuse+LangChain打造可观测的AI应用:从埋点到成本监控实战

本文详细介绍了如何将开源可观测性平台LangFuse深度集成到基于LangChain构建的AI应用中,特别是电商客服机器人场景。通过从基础SDK集成、提示词管理到成本监控的完整实战,帮助开发者实现对LLM应用内部工作流的清晰追踪、问题排查与费用分析,从而打造稳定、可控的生产级AI应用。

dapp9builder的博客 711

带你深入理解 Java成员变量,局部变量和静态变量的创建和回收时机

请注意,这里只是简单介绍了成员变量、局部变量和静态变量的创建和回收时机,实际上还涉及到更复杂的垃圾回收机制和内存管理。具体的情况会受到JVM的实现和运行环境的影响。在编写代码时,要根据需求选择合适的变量类型,并合理管理对象的生命周期和内存使用。Java中的成员变量、局部变量和静态变量具有不同的创建和回收时机。当对象不再被引用时,该对象及其成员变量都会被垃圾回收器回收。对象时,都会为该对象分配一块内存来存储。将被销毁,其占用的内存空间会被释放。是一个成员变量,它属于。是一个静态变量,它属于。

Dakaring的专栏 2893

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

qq_36773158的博客 4646

Windows Server 2008 R2装不上VMware Tools?别急,手动安装驱动补丁的保姆级教程来了

本文提供了Windows Server 2008 R2手动安装VMware Tools驱动补丁的详细教程,解决驱动签名验证失败问题。通过获取特定补丁文件、创建安装介质、挂载虚拟机并安装补丁等步骤,帮助用户顺利完成VMware Tools安装,提升虚拟机功能与性能。

weixin_28335283的博客 467

GameFramework使用时的问题总结

这个问题是由于静态变量在编辑器重启后引用未清空导致的;在GameEntry类中,存在一个静态变量用于记录已注册的组件,正常情况下,编辑器重启后,这个变量的引用会清空,而在我的项目中,这个变量的引用未清空,但引用指向的实例已经为Null,所以导致新组件无法加入到这个集合中。解决方法很简单,在ProjectSettings中将下面的选项取消选中即可。

qq_44934976的博客 166

IVP 2021 UNETR: Transformers for 3D Medical Image Segmentation

动机 具有跟踪和扩展路径的全卷积神经网络(FCNNs)(如编码器和解码器),近年来在各种医学图像分割应用中显示出了突出的地位。在这些体系结构中,编码器通过学习全局上下文表示来扮演一个不可或缺的角色,该全局上下文表示将进一步用于解码器的语义输出预测。 卷积层作为FCNN的主要构造块,其局部性限制了此类网络学习长时空间依赖的能力。 在NLP领域,基于transformer的模型已经在各种任务中实现了最先进的基准。transformer中的自我注意机制使他们能够动态地突出词序列的重要特征并学习其长时依赖关系。这

smile909的博客 1979

Android用什么替换静态对象,Android 慎用static静态变量

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?前言Android是用Java开发,其静态变量的生命周期遵守Java的设计。我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区。当类被卸载的时候,静态变量被销毁。在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。那么在Android中呢?用的Dalvik vm也是一样的。不...

weixin_35539437的博客 464

别再为数据发愁:5分钟理解事件相机原理,并自己动手生成事件图像

本文深入浅出地解析了事件相机的工作原理,并提供了从静态图像生成事件数据的实用方法。通过Python代码示例,读者可以快速掌握如何模拟事件相机的输出,应用于机器人导航、自动驾驶等领域,解决数据获取难题。

weixin_31458015的博客 300

秋招突击——笔试整理——8/25——拼多多笔试整理

继续加油! 转变思维,有简单到复杂,由直观到抽象,这种贪心模拟的题目一直是这样的!

Blackoutdragon的博客 2400

android 静态变量替代,Android--慎用static静态变量

Android是用Java开发,其静态变量的生命周期遵守Java的设计。静态变量是在类被load的时候分配内存的,并且存在于方法区。当类被卸载的时候,静态变量被销毁。在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。那么在Android中呢?用的Dalvikvm也是一样的。不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型...

weixin_35778245的博客 337

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android static 作用,android 尽量不要使用static静态变量

使用静态static静态变量潜在性问题:1.占用内存,并且内存一般不会释放;2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。3.不能将activity作为static静态对象,这样使activity的所有组件对象都存入全局内存中,并且不会被回收;(转自:http://blog.youkuaiyun.com/ctcwri/article/details/8858414)静态变量的生命周...

weixin_34384824的博客 1598

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Android】static静态变量的生命周期——静态之坑

Android 中static静态变量幽灵

学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗,学习只为当小狗狗 3590

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android static

尽量不要使用static静态变量!!! 使用静态static静态变量潜在性问题: ①占用内存,并且内存一般不会释放。 ②在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。 ③不能将activity作为static静态对象,这样使activity的所有组件对象都存入全局内存中,并且不会被回收。 静态变量的生命周期: ①类在什么时候被加载? 当我们启动一个app的时候,系统会创建一个进程,此进程会加载一个Dalvik VM的实例,然后代码就运行在DVM之上,类的加载和卸载,垃圾回收等事情都由

zenmela2011的专栏 1079

Android之static静态变量生命周期

静态变量引用与内存回收、内存泄露这些问题有关,有必要加深研究和理解。 一、静态变量在类被加载的时候分配内存。 类在什么时候被加载?当我们启动一个app的时候,系统会创建一个进程,此进程会加载一个DVM实例,然后代码就运行在DVM之上,类的加载和卸载、垃圾回收等事情都由DVM负责。也就是说进程启动的时候,类被加载,静态变量被分配内存。 二、静态变量在类被卸载的时候...

LVXIANGAN的专栏 691

android 尽量不要使用static静态变量

使用静态static静态变量潜在性问题: 1.占用内存,并且内存一般不会释放; 2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。 3.不能将activity作为static静态对象,这样使activity的所有组件对象都存入全局内存中,并且不会被回收; (转自:http://blog.youkuaiyun.com/ctcwri/article/details/88...

angen3675的博客 172

八,Java static 使用之静态变量

目录Java 中的 static 使用之静态变量一,先认识一下静态变量二,静态方法的使用三,static 使用之静态初始化块 Java 中的 static 使用之静态变量 一,先认识一下静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!! Java 中被 ...

qq_42610167的博客 552

Android中静态变量(static)的使用

在Android 开发过程中想必有很多人喜欢使用 static 静态变量,当然我也喜欢。但是往往会出现一些意想不到的Bug。 最近公司的一个项目由我和另一个同事共同负责,我这边负责一个Service,所有的操作在一个Service中完成,开发结束本人测试也正常,但是整合到同事项目中却出现了静态变量获取不到值,一开始是怀疑同事那边静态变量赋值出现问题,经查证同事的Activity中对静态变量赋值完

zcmain的专栏 3072

为什么Android不建议activity之间用static传值

一般来说,在Android开发中都会用intent来传值,但是遇到数据量很大的时候,可能还要序列化才可以,这样反而增加了开销,为什么不直接用static来传值呢? 如果在activity中写一个static变量来访问的话,这是大忌,可能导致该activity不能被回收,造成内存泄漏。那如果我新开一个类专门用来传递static变量呢? 答案也是不行! 首先静态变量不容易被回收,伴随着整个进程,如果当...

乌龟赛跑 1393

static 静态变量和静态代码块的执行顺序

    众所周知 在android中static 修饰的会被称之为 静态常量,静态变量, 静态方法 ,还有就是静态代码块,用static{ // 代码块 非static修饰的方法,变量,常量, 是不能再静态代码块中使用的 } 表示。       static修饰的 是跟着类走的, 而不是跟随对象,这个大家都是知道的。 那么大家是否知道它们之间的运行顺序的关系呢? 今天, 我就给大家简单讲解一下吧。...

sinat_34089391的博客 3万+

android Java static 静态变量

android app  使用 static 静态变量 在退出时要记得清空否则会出现 很奇怪的现象

457
上一篇: Android四大基本组件介绍与生命周期
下一篇: Android static静态成员变量的使用误区
绝凌峰
博客等级 码龄18年 28粉丝 183原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值