2013-03-16 79 views
1

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

我试着分析这两个,它似乎从来没有工作,但这是一个不同的问题。

+1

可以显示代码(至少是相关部分)吗? – assylias 2013-03-16 14:19:09

+1

你有一个静态方法的类(不是“静态类”)吗?你的意思是堆栈对象在调用堆栈上不是对象吗? Java对象始终在堆上。 – 2013-03-16 15:43:22

+0

如果您只调用该方法几百次(而不是每秒几百次),则该方法是否为静态并不重要。 – Niels 2013-03-17 08:04:32

回答

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。看看这个链接的性能提示,特别是下的主题。首选静态虚拟

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

+0

在我发布之前,我在android.com上阅读了该链接。它仍然没有真正回答我的问题,因为一方面它使用静态方法,另一方面它说避免创建对象。如果我使该方法成为静态方法,那么每次运行时都必须创建堆栈对象。如果方法是非静态的,我可以重用堆栈对象。 – Joymo 2013-03-16 22:58:34

+0

你是否使用静态变量获取任何内存泄漏? – Raghunandan 2013-03-17 06:00:33

0

这实际上是一个关于尝试重用对象的问题。如果声明static成员,则也可以在static方法中重复使用对象。另外:是的,这可能是更好的设计这没有static什么。

无论如何,重用的好处是避免创建对象。您仍然需要支付一些“清除”对象状态的开销。否则,在类似Stack的情况下,您可能会冒内存泄漏。

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

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

您还总是为整个运行时支付此对象的内存成本。

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

试图重新使用对象仅用于性能很少是性能上的胜利。它必须处于一个紧密的循环中,并且不会遇到以上几个可能的问题值得。