【问题标题】:Android Static Variable Scope and LifetimeAndroid 静态变量作用域和生命周期
【发布时间】:2011-07-15 10:16:17
【问题描述】:

我有一个应用程序有一个服务,它使用ArrayList<Double> 在后台存储数字很长时间;该变量在服务启动时初始化。

服务在后台,会频繁访问变量(这就是我不想使用文件管理或设置的原因——为了文件 I/O 会非常昂贵电池寿命)。

该变量在其生命周期内可能约为 1MB->2MB。

是否可以肯定地说变量永远不会被 GC 或系统清空,或者有什么方法可以防止它?

【问题讨论】:

    标签: android memory-management scope instance-variables power-management


    【解决方案1】:

    可以说变量永远不会被GC或系统清空

    可以,只要可以在您的代码中访问变量,但这可能是好事也可能是坏事。

    静态变量的“生命周期”是类的生命周期——加载该类时“永远永远”——作用域是可以访问所述稳定标识符的任何代码,例如虽然也可以考虑反射,但通过可见性修饰符允许的内容。

    但是,变量不是经过 GC 处理的——对象是,因此显式/手动将变量设置为“null”或“虚拟对象”(如果不是)正在使用的对象可能 -- 如果没有对变量用来引用的对象的其他引用 -- 使所述 object 符合回收条件。

    但是,如果可能的话,最好避免使用静态值,因为这也有助于隐式对象生命周期控制。

    编码愉快。

    【讨论】:

      【解决方案2】:

      我有一个应用程序,它有一个使用 ArrayList 在后台存储数字很长时间的服务

      如果“很长一段时间”大于“几秒钟,或者只要用户明确要求它运行”,那么我们就有问题了。

      简单地说,您的服务不会“持续很长时间”。用户将使用任务杀手将其杀死,或者用户将使用设置应用程序将其杀死,或者Android会由于年龄过大而将其杀死。太多的开发者泄露了服务,导致设备性能下降。

      真正需要运行的服务很少(例如,在下载大文件时)或应用户请求(例如,音乐播放器)。

      是否可以肯定地说变量永远不会被 GC 或系统清空,或者有什么方法可以防止它?

      只要进程存在,它就会存在。该过程将一直存在,直到您停止服务(假设没有其他组件在运行),或者直到用户重新启动手机,或者直到前面概述的任何场景(例如,任务杀手)发生。

      【讨论】:

      • 谢谢。这就是我一直在寻找的。 :)
      • 如果某个应用程序不使用任何服务并且用户通过从最近的应用程序中删除它来杀死应用程序,它的进程是否会停止,并且一切都会像静态方法对象等一样消失,并且会在应用程序从图标重新启动时重新创建?请回答..
      • @blackHawk:“它的进程会停止吗?”——是的,通常进程会被终止。 “一切都像静态方法对象等一样消失了,当应用程序从图标重新启动时会重新创建?” -- 这取决于您的应用以及何时为 static 字段分配值。
      猜你喜欢
      • 2013-07-27
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2011-04-18
      • 2011-08-06
      • 2011-12-29
      • 2019-09-03
      相关资源
      最近更新 更多