1

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

我已经尝试对两者进行分析,但它似乎永远不会起作用,但这是一个不同的问题。

4

2 回答 2

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

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

于 2013-03-16T15:40:03.363 回答
0

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

无论如何,重用的好处是避免创建对象。您仍然需要支付一些“清除”对象状态的成本。否则,在类似Stack.

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

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

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

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

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

于 2013-03-16T15:48:46.790 回答