我的规则是,在原语的情况下,我可以随时声明它们static
,因为它们不会消耗太多内存。实际上,我通常使用static
原语作为项目常量。
但是,我看到很多程序员也将对象声明为static
。显然static
对象会增加每个新static
对象的内存消耗。
例如,我经常看到sharedpreference
对象被声明为静态,因此任何类都可以通过从代码中的任何位置调用apply()
来获取更新的信息。我没有使用它,但我创建的是实例对象而是以不同的方式处理登录。
那么,我们如何确保我们可以安全地将某个对象声明为static
?我们是否尝试预测其内存消耗还是有其他更好的方法?
问题的原因是移动设备上占用100MB或RAM的项目。不必要地使用静态对象,因此大量数据不需要保存在RAM中。将静态对象转换为实例对象后,内存消耗降至60MB。
PS。我已经看到在应用程序中使用静态对象的可怕情况,因为程序员懒得正确处理逻辑,这些应用程序消耗的内存比他们应该多100%。
答案 0 :(得分:5)
这个
显然,静态对象会增加每个新静态对象的内存消耗。
是完全错误的:静态引用不会消耗比非静态引用更多或更少的内存。
当然,静态引用的对象将保留在内存中,只要具有引用的类保留在内存中,这可能直到JVM结束。
另一方面,如果每个需要A
的实例创建并保留A
的实例,它将为每个人消耗比单个A
更多的内存。
但是在99%的情况下,内存消耗实际上是无关紧要的,所以我通常只在遇到问题时才考虑它,否则很明显如果我不考虑它会遇到问题。
更重要的是以下标准:
我是否想要一个不同的实例,例如测试。
真的每个人都需要相同的实例吗?
我可能想使用继承
如有疑问,请勿使用静态
关于更新后的问题,该问题澄清了OP询问内存约束设备
听起来有人在内存约束设备上使用静态引用的对象作为某种缓存,即为了避免重新创建某些对象。
基于这个假设,推理有些不同,结果或多或少相同:
在您知道需要之前不要缓存内容
如果您缓存某些内容,请确保通过实际衡量来帮助您实现绩效目标
确保没有其他任何内容,在这种情况下尤其是内存约束
如有疑问:请勿缓存
最后:如果你需要一个缓存,请使用缓存,而不是像被滥用的静态引用那样的黑客攻击解决方案。
答案 1 :(得分:4)
你完全回到了前面。它是实例变量将使用更多内存,并且静态变量需要强烈动机才能使它们变为静态。如果你没有充分的理由让它们变得静止,你就不应该这样做。
PS。我已经看到在应用程序中使用静态对象的可怕情况,因为程序员懒得正确处理逻辑,这些应用程序消耗的内存比他们应该多100%。
完全废话。你从来没有见过这样的事情。使用静态变量并不会使内存加倍,除非该类从未实例化。