首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中查找内存使用情况

在Java中查找内存使用情况
EN

Stack Overflow用户
提问于 2009-02-17 05:08:29
回答 8查看 9.5K关注 0票数 6

下面是我需要解决的情况。我提出了两种解决办法。

我需要维护从数据库中获取的数据缓存,以便在Swing GUI上显示。每当我的JVM内存超过其分配内存的70%时,我需要警告用户过度使用。一旦JVM内存使用率超过80%,我就必须停止所有数据库查询,并清理作为用户操作的一部分并通知用户的现有缓存。在清理过程中,我将根据某些规则手动处理删除一些数据,并指示JVM使用GC。每当发生GC时,如果内存清理并达到分配内存的60%,我需要重新启动所有数据库处理,并将控制权还给用户。

为了检查JVM内存统计信息,我发现了以下两种解决方案。无法决定哪一种方法是最好的,以及原因。

  1. Runtime.freeMemory() -创建线程,每10秒运行一次,检查空闲内存,如果内存超过上述限制,必要的弹出窗口将使用户亲密,并调用停止操作和释放memory.
  2. MemoryPoolMXBean.getUsage()的方法--Java5引入了JMX,以便在运行时获取内存快照。在JMX中,我不能使用阈值通知,因为它只在内存达到/超过给定阈值时才会通知。使用的唯一方法是在MemoryMXBean中轮询并检查时间段内的内存统计数据.

在使用轮询的情况下,对我来说,这两个实现似乎是相同的。

请提出这些方法的优点,并说明是否有任何其他替代办法/对所用方法的任何更正。

EN

Stack Overflow用户

发布于 2011-09-15 15:14:42

很晚之后,我知道,但我想我应该张贴一个例子,我是如何做到这一点。希望它能对某些人有所帮助(我强调,这是一个主要例子的证明,没有别的.也不是特别优雅:)

只要把这两个函数放在一个类中,它就能工作了。

编辑:哦,还有import java.util.ArrayList; import java.util.List;

代码语言:javascript
运行
复制
public static int MEM(){
    return (int)(Runtime.getRuntime().maxMemory()-Runtime.getRuntime().totalMemory() +Runtime.getRuntime().freeMemory())/1024/1024;
}

public static void main(String[] args) throws InterruptedException
{
    List list = new ArrayList();

    //get available memory before filling list
    int initMem = MEM();
    int lowMemWarning = (int) (initMem * 0.2);
    int highMem = (int) (initMem *0.8);


    int iteration =0;
    while(true)
    {
        //use up some memory
        list.add(Math.random());

        //report
        if(++iteration%10000==0)
        {
            System.out.printf("Available Memory: %dMb \tListSize: %d\n", MEM(),list.size());

            //if low on memory, clear list and await garbage collection before continuing
            if(MEM()<lowMemWarning)
            {
                System.out.printf("Warning! Low memory (%dMb remaining). Clearing list and cleaning up.\n",MEM());

                //clear list
                list = new ArrayList();  //obviously, here is a good place to put your warning logic

                //ensure garbage collection occurs before continuing to re-add to list, to avoid immediately entering this block again
                while(MEM()<highMem)
                {
                    System.out.printf("Awaiting gc...(%dMb remaining)\n",MEM());
                    //give it a nudge
                    Runtime.getRuntime().gc(); 
                    Thread.sleep(250);
                }

                System.out.printf("gc successful! Continuing to fill list (%dMb remaining). List size: %d\n",MEM(),list.size());
                Thread.sleep(3000); //just to view output
            }
        }
    }
}

编辑:然而,这种方法仍然依赖于使用-Xmx在jvm中合理地设置内存。

EDIT2:看来gc请求行确实能帮上忙,至少在我的jvm上是这样的。ymmv

票数 0
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/555580

复制
相关文章

相似问题

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