如何判断某些对象不应该声明为静态?

时间:2015-12-01 10:00:03

标签: java android static

我的规则是,在原语的情况下,我可以随时声明它们static,因为它们不会消耗太多内存。实际上,我通常使用static原语作为项目常量。

但是,我看到很多程序员也将对象声明为static。显然static对象会增加每个新static对象的内存消耗。

例如,我经常看到sharedpreference对象被声明为静态,因此任何类都可以通过从代码中的任何位置调用apply()来获取更新的信息。我没有使用它,但我创建的是实例对象而是以不同的方式处理登录。

那么,我们如何确保我们可以安全地将某个对象声明为static?我们是否尝试预测其内存消耗还是有其他更好的方法?

问题的原因是移动设备上占用100MB或RAM的项目。不必要地使用静态对象,因此大量数据不需要保存在RAM中。将静态对象转换为实例对象后,内存消耗降至60MB。

PS。我已经看到在应用程序中使用静态对象的可怕情况,因为程序员懒得正确处理逻辑,这些应用程序消耗的内存比他们应该多100%。

2 个答案:

答案 0 :(得分:5)

这个

  

显然,静态对象会增加每个新静态对象的内存消耗。

是完全错误的:静态引用不会消耗比非静态引用更多或更少的内存。

当然,静态引用的对象将保留在内存中,只要具有引用的类保留在内存中,这可能直到JVM结束。

另一方面,如果每个需要A的实例创建并保留A的实例,它将为每个人消耗比单个A更多的内存。

但是在99%的情况下,内存消耗实际上是无关紧要的,所以我通常只在遇到问题时才考虑它,否则很明显如果我不考虑它会遇到问题。

更重要的是以下标准:

  1. 我是否想要一个不同的实例,例如测试。

  2. 真的每个人都需要相同的实例吗?

  3. 我可能想使用继承

  4. 如有疑问,请勿使用静态

  5. 关于更新后的问题,该问题澄清了OP询问内存约束设备

    听起来有人在内存约束设备上使用静态引用的对象作为某种缓存,即为了避免重新创建某些对象。

    基于这个假设,推理有些不同,结果或多或少相同:

    1. 在您知道需要之前不要缓存内容

    2. 如果您缓存某些内容,请确保通过实际衡量来帮助您实现绩效目标

    3. 确保没有其他任何内容,在这种情况下尤其是内存约束

    4. 如有疑问:请勿缓存

    5. 最后:如果你需要一个缓存,请使用缓存,而不是像被滥用的静态引用那样的黑客攻击解决方案。

答案 1 :(得分:4)

你完全回到了前面。它是实例变量将使用更多内存,并且静态变量需要强烈动机才能使它们变为静态。如果你没有充分的理由让它们变得静止,你就不应该这样做。

  

PS。我已经看到在应用程序中使用静态对象的可怕情况,因为程序员懒得正确处理逻辑,这些应用程序消耗的内存比他们应该多100%。

完全废话。你从来没有见过这样的事情。使用静态变量并不会使内存加倍,除非该类从未实例化。