内存中有一个存储我的对象的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应该以某种方式缓存它,但是否有人真正了解这一点呢?
发布于 2014-03-01 09:32:12
由于Java 7,因此不再需要轮询空闲内存。可以为垃圾收集事件注册。见本文:http://www.fasterj.com/articles/gcnotifs.shtml
所以,我能想到的最好的方法就是在垃圾收集之后检查空闲内存,如果需要的话,再释放额外的空间。
发布于 2011-12-17 13:29:31
为什么不使用JMXBeans来完成这个任务呢?它是为了简化这种操作而设计的。
从医生那里..。
API提供对以下信息的访问: 加载的类数和运行虚拟机正常运行时间的线程数、系统属性和JVM输入参数线程状态、线程争用统计信息和活动线程堆栈跟踪内存消耗垃圾收集统计数据、低内存检测、按需死锁检测操作系统信息
具体参见MemoryPoolMXBean中的示例代码
发布于 2011-12-15 17:27:14
没有直接回答您的问题,但正如注释中已经说过的,freeMemory计算的是空闲内存,而不是GC之后可用的内存,因此,如果在GC运行之前调用freeMemory,您可能会认为您已经达到了"underPressure“限制,但是在下一次GC运行之后您还可以拥有大量的空闲内存。
另一种方法可能是创建一个软可达的对象,并检查GC是否声称它:
类似于:
SoftReference<Object> sr = new SoftReference<Object>(new Object(),new ReferenceQueue<Object>());
public boolean underPressure(){
if (sr.isEnqueued()) {
// recreate object to monitor
sr = new SoftReference<Object>(new Object(),new ReferenceQueue<Object>());
return true;
}
return false;
}https://stackoverflow.com/questions/8523517
复制相似问题