我想知道这是否可行。我的目的是在长时间处理期间减少GC操作的数量。
在Android应用程序中,我使用以下命令检查可用和最大堆大小:
Runtime runtime = Runtime.getRuntime();
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
System.out.println( "freeMemory: " + runtime.freeMemory() );
System.out.println( "maxMemory: " + runtime.maxMemory() );
System.out.println( "memoryClass: " + am.getMemoryClass() );
在LogCat的onCreate()
方法中,它说:
freeMemory: 5678992
maxMemory: 50331648
memoryClass: 48
然后我执行一些长String
个操作,在处理过程中我再次检查内存:
freeMemory: 1833176
(我不发布此处理的代码,因为在实际阶段我不执行Java
代码优化,只使用内存。)
GC运行以释放内存。这会降低应用程序的速度:
GC_CONCURRENT freed 4760K, 42% free 7653K/13123K, paused 12ms+13ms, total 43ms
GC_CONCURRENT freed 2012K, 42% free 7688K/13123K, paused 12ms+2ms, total 31ms
GC_CONCURRENT freed 1839K, 42% free 7662K/13123K, paused 12ms+12ms, total 40ms
在处理结束时,空闲内存为:
freeMemory: 4605040
正如文件所说:
Runtime.freeMemory()
返回堆上当前可用的字节数,而不扩展堆。
Runtime.maxMemory()
返回堆可以扩展到的最大字节数。
据我所知,Runtime.maxMemory()
显示了不应溢出的内存以阻止OutOfMemoryError
。超过Runtime.freeMemory()
数量只会导致自由记忆扩大。
因此,代码中的GC释放操作是由内存消耗操作后剩余的可用内存量较少引起的(当它说:freeMemory: 1 833 176
时)。但是,可用内存的总量没有扩大,只能保持在相同的起始限制内。
我认为可用内存的初始量也不是很高(因为它显示onCreate()
方法5 678 992
)。如果我最初有大约10 MB的空闲时间,则GC不会发生,因此应用程序可以更快地执行处理。
所以问题是:有没有办法可以增加可用内存的初始量,以防止频繁的GC调用和内存扩展?
感谢。
答案 0 :(得分:0)
在Mainifast.xml中使用此属性
android:largeHeap="true"