【问题标题】:Java android optimization. Non-static or static method?Java 安卓优化。非静态还是静态方法?
【发布时间】:2013-03-16 14:18:21
【问题描述】:

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

我已经尝试对这两者进行分析,但它似乎从来没有工作过,但这是一个不同的问题。

【问题讨论】:

  • 你能显示代码(至少是相关部分)吗?
  • 你有一个带有静态方法的类(不是“静态类”)对吧?你的意思是Stack 对象不是调用堆栈上的对象吗? Java 对象总是在堆上。
  • 如果您只调用该方法几百次(而不是每秒几百次),则该方法是否为静态都没有关系。

标签: android performance optimization stack dalvik


【解决方案1】:

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

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

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

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

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

您可以使用名为 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。查看此链接以获取性能提示,尤其是 Prefer Static Over Virtual 下的主题。

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

【讨论】:

  • 在我发帖之前,我在 android.com 上阅读了该链接。它仍然没有真正回答我的问题,因为一方面,它说要使用静态方法,但另一方面,它说要避免创建对象。如果我将方法设为静态,则每次运行时都必须创建堆栈对象。如果方法是非静态的,我可以重用堆栈对象。
  • 您是否使用静态变量出现内存泄漏??
【解决方案2】:

这确实是一个关于尝试重用对象的问题。如果您声明 static 成员,您也可以在 static 方法中重用对象。另外:是的,最好在没有static 的情况下设计它。

无论如何,重用的好处是避免创建对象。您仍然需要支付一些“清除”对象状态的成本。否则,在Stack 之类的情况下,您将面临内存泄漏的风险。

有一个持续的维护问题:您向对象添加了新状态,并且您还记得更新清除它的方法吗?

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

您还必须为整个运行时内存中的该对象支付内存成本。

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

仅仅为了性能而尝试重用对象很少能带来性能上的胜利。它必须处于一个紧密的循环中,并且不会遇到上述几个可能的问题才值得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多