【发布时间】:2013-06-08 13:07:52
【问题描述】:
在我的代码中,通常在我不控制配置的服务器上运行,我有用户集合,每个用户都有一个 byte[] 数组。
有时这些byte[] 数组对用户来说是唯一的。但是,通常会有大量用户使用完全相同的 byte[] 数组。
我正在尝试减少服务器的 RAM 消耗。
我尝试将我的byte[] 数组转换为字符串并将它们实习,但是我经常遇到PERM-GEN 内存不足错误。当我想为用户访问 byte[] 数组时,我还看到编码/解码的性能显着下降,并且我看到更坏情况下的内存使用量大大增加 - 可能字符串比数组大得多。
当 Java 数组不可散列并且 SoftReferences 不包装对象的散列点时,我如何进行Set<SoftReference<byte[]>> 查找。 Map<byte[],SoftReference<byte[]>> 显然也在打败自己,因为关键是它自己并且阻止了收集;而Set 在内部以Mapanyway 的形式实现。
那么我该如何实习生 byte[] 数组?
【问题讨论】:
-
浮现在脑海中的一件事是享元模式。也看看stackoverflow.com/questions/1058149/…
-
我认为你必须包装你的字节数组,有效地将它们装箱,例如与
new ByteArray(byte [] theBytes)一起使用,并且永远不要在ByteArray本身之外对theBytes进行额外的长期引用。然后对ByteArrays 的软引用将正常工作。您也可以查看WeakHashMap<ByteArray, User>以了解您的应用程序。 -
这些字节数组有多大?用户如何获得一个?
-
@fge 它们通过网络到达,并且是“房间”密钥 - 可变长度,有时短,有时 1K 或更多 - 在另一个服务器系统上。有时很多用户在同一个“房间”,有时他们有自己的房间等等。