ali*_*n01 7 java memory collections performance
这是一个愚蠢的问题,但在这里.
我有一个多线程程序和一个独特元素的"全局"集合.对于ConcurrentHashMap,我因性能而拒绝同步的Set实现.我真的不需要Map的Value部分,所以我想在内存使用方面使用java中最小的Object.我以不同的方式解决了这个问题(在Map中多次引用了一个布尔对象),但我仍然很好奇Java中最小的对象是什么.我一直认为它是布尔值,但我认为这不是真的(Java - 布尔基元类型 - 大小,基元数据类型)
实际上,这并不重要,因为每个关联的值部分被固定为参考.您甚至可以null在此处使用值,但任何其他(固定)对象引用应该没问题(有时候更方便).我更喜欢Boolean.TRUE(或类似的"众所周知的"单身人士).然后,您可以通过测试会员资格
if (myMap.get(someKey) != null) { ... }
Run Code Online (Sandbox Code Playgroud)
此外
if (myMap.containsKey(someKey)) { ... }
Run Code Online (Sandbox Code Playgroud)
如果你想要一个Set<K>由a支持的ConcurrentHashMap,你应该使用Collections.newSetFromMap,例如
final Set<K> set = Collections.newSetFromMap(new ConcurrentHashMap<K, Boolean>());
Run Code Online (Sandbox Code Playgroud)
现在,如果你真的想推倒重来,而在乎那多的内存使用情况,我建议你只使用纯Object作为你的价值.由于Java中的每个对象都继承自Object(通用基类),因此内存中任何对象的大小必须大于或等于plain的大小Object.您不能使用原语,因为泛型类型参数必须是Objects.
编辑:实际上,在这里分配一个特定的对象作为你的值将比使用一个可能被分配的预先存在的对象占用更多的内存.您可以使用对在VM初始化期间或多或少总是分配的对象的引用,例如Object.class.我真的建议你只使用第一个解决方案.
| 归档时间: |
|
| 查看次数: |
2718 次 |
| 最近记录: |