我有一个MyClass类,它包含一个大缓冲区,大约12Mb。
当我的应用程序正在运行时,此类的实例经常(每秒50次)更新。
最具记忆性和性能的方法是什么: 为每个更新创建一个新对象,让前一个对象被垃圾收集或总是使用同一个对象?并且,不使用相同的对象创建内存泄漏?
或者,在伪代码中:
是
MyClass object = new MyClass();
while(appIsRunning)
{
if (getUpdatedObject(object))
doSomething(object);
}
优于
while(appIsRunning)
{
MyClass object = new MyClass();
if (getUpdatedObject(object ))
doSomething(object);
}
我正在努力使这个问题尽可能普及,但我准备在需要时添加任何细节。
答案 0 :(得分:1)
某些java虚拟机在创建已知大小的小对象时(不在其范围之外查看)会在堆栈中创建对象,而不是在堆中创建对象。例如oracle JVM在第7版之后这样做。因此,在内部创建小型恒定大小的临时数组可能更有效。
但我不知道Android中的VM是如何运作的。当然,当你的MyClass总大小很大时,无论如何它都将在堆中创建。
当在堆中创建对象,并且不再引用它时,它将被垃圾收集,这意味着将检查和/或移动所有其他对象以释放未使用的空间。这需要CPU资源并减慢应用程序。
因此,每次创建新的大对象时,都会导致内存使用速度快,并且经常运行垃圾收集器。这可能会大大减慢应用程序的执行和响应速度。
另一方面,当你在外面创建单个对象时,它不会导致垃圾收集开销,但它的整个内存仍然占用整个时间,并且不能被垃圾收集,即使不使用对象在很短的时间内。
良好的妥协是使用WeakReference或SoftReference。它是对象的引用容器,但它们不会阻止对象被垃圾回收。因此,您可以重用您的对象(如果它保留在内存中),或者只有在引用丢失的情况下才创建新对象
WeakReference只允许你获取对象的引用,如果它还没有被垃圾收集。
SoftReference强制垃圾收集器保持对象完整,直到堆中没有足够的可用空间。