首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何监控Java内存使用情况?

如何监控Java内存使用情况?
EN

Stack Overflow用户
提问于 2009-06-29 15:41:19
回答 14查看 203K关注 0票数 75

我们有一个运行在Jboss上的j2ee应用程序,我们想要监控它的内存使用情况。目前,我们使用以下代码

代码语言:javascript
复制
    System.gc();
    Runtime rt = Runtime.getRuntime();
    long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
    logger.information(this, "memory usage" + usedMB);

这段代码运行良好。这意味着它显示了与现实相对应的记忆曲线。当我们从数据库创建一个大的xml文件时,曲线上升,提取完成后下降。

一位顾问告诉我们,显式调用gc()是错误的,“让jvm决定何时运行gc”。基本上,他的观点与disscussed here是一样的。但我还是不明白:

  • 如何获得内存使用曲线?
  • 显式gc()有什么问题?我不关心显式gc()可能发生的小性能问题,我估计会有1-3%的性能问题。我需要的是内存和线程监视器,它们可以帮助我在客户现场分析我们的系统。
EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-06-29 15:46:35

如果您想真正了解VM内存中发生了什么,您应该使用像VisualVM这样的好工具。这是一个自由软件,这是一个很好的方式来了解正在发生的事情。

显式gc()调用没有什么真正的“错误”。但是,请记住,当您调用gc()时,您是在“建议”运行垃圾收集器。不能保证它将在您运行该命令的确切时间运行。

票数 64
EN

Stack Overflow用户

发布于 2009-06-29 15:59:42

有一些工具可以让您监控VM的内存使用情况。VM can expose memory statistics using JMX。您还可以通过print GC statistics查看内存随时间的变化情况。

调用System.gc()可能会损害GC的性能,因为对象将过早地从新一代移到旧一代,弱引用将被过早清除。这可能会导致内存效率降低,GC时间更长,缓存命中率降低(对于使用弱ref的缓存)。我同意你的顾问的观点: System.gc()很糟糕。我甚至可以使用命令行开关来使用disable it

票数 29
EN

Stack Overflow用户

发布于 2014-07-04 02:29:36

你可以看看stagemonitor。它是一个开源的java (web)应用程序性能监视器。它捕获响应时间指标、JVM指标、请求细节(包括由请求分析器捕获的调用堆栈)等。开销非常低。

您还可以选择使用强大的timeseries数据库石墨来存储数据点的长期历史记录,您可以使用花哨的仪表板查看这些数据点。

示例:

查看project website以查看屏幕截图、功能描述和文档。

注:我是stagemonitor的开发者

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

https://stackoverflow.com/questions/1058991

复制
相关文章

相似问题

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