Java 使用LRUCache时如何防止内存分配?

Java 使用LRUCache时如何防止内存分配?,java,garbage-collection,allocation,android-lru-cache,Java,Garbage Collection,Allocation,Android Lru Cache,我正在为Android移动平台开发一款游戏,一切都很顺利。然而,我现在想解决一些我在发展过程中注意到的问题,直到现在我都忽略了这些问题 我正在使用一个LRUCache来存储带有Integer键的AndroidBitmap对象。问题是,当我尝试使用基元类型的键int在LRUCache中存储位图时,Integer对象使用Integer.valueOf(int)分配内存,以将基元整数转换为等价的Integer对象 这一切都很好,但在我的游戏主循环的图形渲染部分,它会导致并发垃圾收集,导致帧速率下降,这

我正在为Android移动平台开发一款游戏,一切都很顺利。然而,我现在想解决一些我在发展过程中注意到的问题,直到现在我都忽略了这些问题

我正在使用一个LRUCache来存储带有
Integer
键的Android
Bitmap
对象。问题是,当我尝试使用基元类型的键
int
在LRUCache中存储
位图时,
Integer
对象使用
Integer.valueOf(int)
分配内存,以将基元整数转换为等价的
Integer
对象

这一切都很好,但在我的游戏主循环的图形渲染部分,它会导致并发垃圾收集,导致帧速率下降,这会在垃圾收集发生时每隔一段时间造成明显的延迟。下面是我日志的一部分,它测量了图形渲染所需的时间。我的渲染方法在很大程度上依赖于从LRUCache加载
Bitmap
对象,因此,当分配可能非常频繁时,它会导致如下延迟,这是可以理解的:

07-27 17:55:41.418: W/Render(13937): Time: 28ms
07-27 17:55:41.438: W/Render(13937): Time: 28ms
07-27 17:55:41.468: W/Render(13937): Time: 29ms
07-27 17:55:41.498: W/Render(13937): Time: 29ms
07-27 17:55:41.528: D/dalvikvm(13937): GC_CONCURRENT freed 384K, 13% free 17265K/19756K, paused 3ms+1ms, total 17ms
07-27 17:55:41.548: W/Render(13937): Time: 44ms
07-27 17:55:41.578: W/Render(13937): Time: 27ms
07-27 17:55:41.608: W/Render(13937): Time: 28ms
07-27 17:55:41.628: W/Render(13937): Time: 28ms
07-27 17:55:41.658: W/Render(13937): Time: 29ms

有没有办法在我的应用程序中分配内存?或者有一种替代LRUCache的方法可以接受诸如
int
之类的基元类型吗?

我不知道Java缓存使用基元
int
键,但是修改开源缓存(例如Guava)应该不会太难:删除“implements
Map
”语句,将所有
K
s替换为
int
s,将所有
V
s替换为
Object
s(我面前没有源代码,但我见过的每个Java缓存都只是一个
Map
加上一些逐出逻辑)。您还需要将对
key.hashCode()
的调用替换为一个内联哈希函数(只需在Google上搜索一个合适的函数,您就可以得到一个便宜的函数,它带有
abs(key*prime\u number)modulo size\u的数组
)。

我创建了一个新的开源基本集合库,名为,您可以使用它。 有一个具有基本长键的There。 支持的数据是int、long或Java对象,这正是您所需要的。 请注意,香蕉通常不是线程安全的,因此请确保适当地同步

PS:该项目仍处于早期阶段,我没有正式发布。 API将来可能会发生变化

顺便说一句,看看其他类,比如BlockAllocator,以及原始链表和映射,我认为它们对Java游戏编写人员特别有用