【发布时间】:2012-01-21 08:25:45
【问题描述】:
我在内存中有一个Map 来存储我的对象。当我用完内存时,我想刷新到内存。我现在正在这样做:
void add(K key, V value) {
if (underPressure()) {
flush(innerMap);
}
innerMap.add(k, v);
}
boolean underPressure() {
Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
long freeMemory = rt.freeMemory();
return (double) freeMemory / maxMemory < threshold;
}
由于每次插入时都会调用underPressure(),所以它有多贵?据我了解,由于它是一个近似值,它应该由 jvm 以某种方式缓存,但是有人真正了解这一点吗?
【问题讨论】:
-
它可能在不同的机器上有所不同。在你的机器上有多贵?您还可以测试
return freememory < maxMemory * threshold;,因为乘法比除法稍快。 -
注意:freeMemory 只告诉你在需要执行 GC 之前你有多少内存。它不会告诉你 GC 后有多少是免费的。
-
就我个人而言,我会去
final boolean underPressure()或者有人会继承并使用带有非常糟糕歌词的说唱来覆盖该方法。然后,每当有人看到该方法签名时,如果他们未超过一定年龄,他们就会将其识别为 Vanilla Ice 的版本,而您将一头雾水。 :-( -
在我的电脑上平均需要 72 ns。
-
是的,在我的机器上它比
new ArrayList<String>()慢了大约 50 倍
标签: java performance memory garbage-collection jvm