4

我正在将 3d 模型(1MB - 10MB)加载到内存中,这需要很长时间(1.5MB 模型需要 20 秒)。当我查看日志时,我看到垃圾收集器不断释放内存并暂停。有关日志,请参见下文:

07-20 17:37:25.340: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 8% free 79443K/85575K, paused 86ms
07-20 17:37:25.350: I/dalvikvm-heap(2826): Grow heap (frag case) to 78.511MB for 852408-byte allocation
07-20 17:37:25.450: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 8% free 80275K/86471K, paused 95ms
07-20 17:37:25.550: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 8% free 80275K/86471K, paused 85ms
07-20 17:37:25.550: I/dalvikvm-heap(2826): Grow heap (frag case) to 79.325MB for 852408-byte allocation
07-20 17:37:25.660: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 8% free 81108K/87367K, paused 96ms
07-20 17:37:25.760: D/dalvikvm(2826): GC_FOR_ALLOC freed 0K, 8% free 81108K/87367K, paused 87ms
07-20 17:37:25.760: I/dalvikvm-heap(2826): Grow heap (frag case) to 80.137MB for 852408-byte allocation
07-20 17:37:25.870: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 8% free 81940K/88263K, paused 98ms
07-20 17:37:26.060: D/dalvikvm(2826): GC_CONCURRENT freed <1K, 5% free 83988K/88263K, paused 3ms+12ms
07-20 17:37:26.200: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 5% free 84715K/88263K, paused 120ms
07-20 17:37:26.200: I/dalvikvm-heap(2826): Grow heap (frag case) to 83.660MB for 852312-byte allocation
07-20 17:37:26.310: D/dalvikvm(2826): GC_FOR_ALLOC freed 0K, 5% free 85547K/89159K, paused 102ms
07-20 17:37:26.420: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 5% free 85547K/89159K, paused 95ms
07-20 17:37:26.420: I/dalvikvm-heap(2826): Grow heap (frag case) to 84.473MB for 852312-byte allocation
07-20 17:37:26.520: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 5% free 86379K/90055K, paused 105ms
07-20 17:37:26.640: D/dalvikvm(2826): GC_FOR_ALLOC freed <1K, 4% free 87212K/90055K, paused 117ms
07-20 17:37:26.650: I/dalvikvm-heap(2826): Grow heap (frag case) to 86.098MB for 852312-byte allocation
...

是否可以将垃圾收集推迟到加载模型之后。也欢迎任何其他性能提示:)

4

3 回答 3

2

不,您不能推迟垃圾收集或以任何其他方式控制它。

但是您可以使用Allocation TrackerDDMS 来查找您正在创建新对象的确切位置。尝试重用相同的对象和缓冲区,避免自动装箱等。这篇关于使用的文章Allocation Tracker可能会有所帮助。

于 2012-07-20T16:11:47.547 回答
1

不。

无论如何,如果您在日志中注意到,VM 正在为内存而苦苦挣扎。它有大约 5% 的免费。它必须执行 GC 才能继续运行您的应用程序。

此外,如果可以的话,你不想这样做。几十年来,聪明的人已经开发出最佳的垃圾收集算法。不要对我比他们聪明。

于 2012-07-20T16:11:33.987 回答
1

不,这是不可能的,虚拟机处理这个并且它是不可更改的。但是为了加快加载模型的速度,您可以考虑使用序列化对象而不是 .3ds/.obj/... 文件。它们将加载更快并使用更少的内存。

查看有关 jpct 和序列化对象的wiki 。

于 2012-07-21T23:30:01.177 回答