首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 8

Stack Overflow用户

发布于 2009-02-17 08:49:31

顺便提一句:Runtime.freeMemory()没有说明分配时剩下的内存量,只是当前分配的内存中空闲的内存量(最初比VM配置的最大内存量要小),但随着时间的推移而增加。

启动VM时,最大内存(Runtime.maxMemory())只定义VM可能分配的内存上限(使用-Xmx VM选项可配置)。总内存(Runtime.totalMemory())是分配给VM进程的内存的初始大小(使用-Xms VM选项可配置),每次分配的内存超过其当前空闲部分(Runtime.freeMemory())时都会动态增长,直到达到最大内存为止。

您感兴趣的度量是可用于进一步分配的内存:

代码语言:javascript
运行
复制
long usableFreeMemory= Runtime.getRuntime().maxMemory()
    -Runtime.getRuntime().totalMemory()
    +Runtime.getRuntime().freeMemory()

或者:

代码语言:javascript
运行
复制
double usedPercent=(double)(Runtime.getRuntime().totalMemory()
    -Runtime.getRuntime().freeMemory())/Runtime.getRuntime().maxMemory()
票数 15
EN

Stack Overflow用户

发布于 2009-02-18 12:54:33

处理这类事情的通常方法是使用WeakReferences和SoftReferences。您需要同时使用这两种方法--弱引用意味着您不会保存多个东西的副本,而软引用意味着GC将一直保存到内存耗尽为止。

如果需要进行额外的清理,则可以添加对队列的引用,并覆盖队列通知方法以触发清理。这是很好的乐趣,但你需要了解这些类做什么。

票数 7
EN

Stack Overflow用户

发布于 2009-02-17 07:22:54

JVM增加到100%的内存使用量是完全正常的,在GC之后返回到10%,每隔几秒钟就这样做一次。

您不需要尝试以这种方式管理内存。在运行完整的GC之前,您不能说保留了多少内存。

我建议你找出你真正想要达到的目标,并以另一种方式看待问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/555580

复制
相关文章

相似问题

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