Java android优化。非静态或静态方法?

时间:2013-03-16 14:18:21

标签: android performance optimization stack dalvik

我有一个带有方法的静态类,我运行了几百次。目前,每次运行该方法时,它都会创建两个不同的堆栈对象。如果我要使该类非静态,那么我可以在构造上创建两个堆栈,然后通过清除它们来重用它们,它会更快吗?我想答案取决于创建一个新的堆栈对象与清除现有的堆栈对象(无论如何可能是空的),如果清除它的性能增益(如果有的话)大于使用非静态方法的性能损失。

我尝试过分析两者,它似乎永远不会奏效,但这是一个不同的问题。

2 个答案:

答案 0 :(得分:2)

这取决于您在代码中如何使用静态变量和方法。

实例变量和对象存储在堆上。 局部变量存储在堆栈中。

静态变量存储在堆上的永久区域中。垃圾收集器通过标记和扫描对象来工作。加载类时,无法为垃圾收集选择静态变量。当相应的类加载器(负责加载此类)本身被收集用于垃圾时,可以收集它们。

如果我有一个值要传递给另一个活动,我将使用意图而不是静态变量。

在自定义列表适配器中,我们使用静态视图。所以使用静态变量或方法取决于不同的情况。

您可以使用名为MAT Analyzer的工具分析对象的内存使用情况。下面的视频讨论了内存管理以及如何检测和解决内存泄漏问题

http://www.youtube.com/watch?v=_CruQY55HOk

   MemoryInfo mi = new MemoryInfo();// current memory usage
  ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  activityManager.getMemoryInfo(mi);
  long availableMegs = mi.availMem / 1048576L;

http://developer.android.com/training/articles/perf-tips.html。请查看此链接以获取性能提示,尤其是首选静态虚拟下的主题。

内存可用性是使用静态变量和方法来考虑性能和避免内存泄漏的标准之一。

答案 1 :(得分:0)

这是一个关于尝试重用对象的问题。如果声明static成员,也可以在static方法中重用对象。另外:是的,没有static任何东西设计它可能会更好。

无论如何,重用的好处是避免了对象的创建。您仍需支付一些“清算”对象状态的费用。否则,在类似Stack的情况下,您会冒内存泄漏的风险。

存在持续的维护问题:您向对象添加新状态,并且,您是否记得更新清除它的方法?

您现在还需要synchronize访问此方法或以其他方式阻止两个线程同时使用它。这可能会引入瓶颈,因为线程无法同时执行该方法。

您还始终为整个运行时支付内存中此对象的内存开销。

在过去,人们会创建对象池抽象,以避免重新创建对象。这有其自身的复杂性和运行时开销,并且通常都不受欢迎,因为创建对象和GC的成本现在相对较小。

尝试仅仅为了性能而重用对象很少是性能上的胜利。它必须处于紧密的循环中,并且不会受到上述几个可能的问题的影响。