Wil*_*ill 14 java garbage-collection
在我的代码中,它通常在服务器上运行,我不控制配置,我有用户集合,每个用户都有一个byte[]数组.
有时这些byte[]数组对用户来说是唯一的.但是,通常会有大量用户使用完全相同的byte[]数组.
我试图减少我的服务器的RAM消耗.
我已经尝试将我的byte[]数组转换成字符串并实习它们,但后来我经常遇到PERM-GEN内存不足错误.当我想byte[]为用户访问数组时,我也发现编码/解码会导致显着的性能下降,而且我看到更糟糕的内存使用情况 - 预备字符串比数组大得多.
Set<SoftReference<byte[]>>当Java数组不可清除时,我如何进行查找?SoftReferences不会将对象的哈希值包装在其中.A Map<byte[],SoftReference<byte[]>>显然也在打败自己,因为关键本身并阻止收集; 并且无论如何Set都是内部实施的Map.
那我怎么能实习 byte[]数组呢?
如果您实际上有许多相同的数组,请使用HashSet<ByteBuffer>缓存.您可以使用方法获取ByteBuffer数组,array()并使用ByteBuffer类hashCode和equals方法.当然,如果你的数组是不可变的,那就更好了.
EDIT2来自@Will的评论是准确的,为了能够取回数组,使用a WeakHashMap<ByteBuffer,WeakReference<ByteBuffer>>并执行类似的操作:
public byte[] internalize(byte[] bytes) {
ByteBuffer wrapped = ByteBuffer.wrap(bytes);
if(cache.containsKey(wrapped)) {
wrapped = cache.get(wrapped).get();
}
else {
cache.put(wrapped, new WeakReference<ByteBuffer>(wrapped);
}
return wrapped.array();
}
Run Code Online (Sandbox Code Playgroud)