4

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

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

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

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

4

2 回答 2

5

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

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

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

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

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

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

于 2011-03-15T01:30:59.540 回答
1

是否可以肯定地说变量永远不会被 GC 或系统清空

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

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

但是,变量不是 GC 的——对象是,所以当变量不被使用时,显式/手动将变量设置为“null”或“dummy object”可能——如果没有其他对变量的对象的引用用来指——使所述对象符合回收条件。

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

快乐编码。

于 2011-03-15T00:02:01.517 回答