首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:关于调用Runtime.freeMemory()、Runtime.totalMemory()和Runtime.maxMemory()的成本

Java:关于调用Runtime.freeMemory()、Runtime.totalMemory()和Runtime.maxMemory()的成本
EN

Stack Overflow用户
提问于 2011-12-15 16:40:37
回答 3查看 2.2K关注 0票数 9

内存中有一个存储我的对象的Map。当我的记忆耗尽时,我想冲进记忆中。我现在就这么做:

代码语言:javascript
复制
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应该以某种方式缓存它,但是否有人真正了解这一点呢?

EN

回答 3

Stack Overflow用户

发布于 2014-03-01 09:32:12

由于Java 7,因此不再需要轮询空闲内存。可以为垃圾收集事件注册。见本文:http://www.fasterj.com/articles/gcnotifs.shtml

所以,我能想到的最好的方法就是在垃圾收集之后检查空闲内存,如果需要的话,再释放额外的空间。

票数 5
EN

Stack Overflow用户

发布于 2011-12-17 13:29:31

为什么不使用JMXBeans来完成这个任务呢?它是为了简化这种操作而设计的。

从医生那里..。

API提供对以下信息的访问: 加载的类数和运行虚拟机正常运行时间的线程数、系统属性和JVM输入参数线程状态、线程争用统计信息和活动线程堆栈跟踪内存消耗垃圾收集统计数据、低内存检测、按需死锁检测操作系统信息

具体参见MemoryPoolMXBean中的示例代码

票数 3
EN

Stack Overflow用户

发布于 2011-12-15 17:27:14

没有直接回答您的问题,但正如注释中已经说过的,freeMemory计算的是空闲内存,而不是GC之后可用的内存,因此,如果在GC运行之前调用freeMemory,您可能会认为您已经达到了"underPressure“限制,但是在下一次GC运行之后您还可以拥有大量的空闲内存。

另一种方法可能是创建一个软可达的对象,并检查GC是否声称它:

类似于:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8523517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档