如何监视Java内存使用情况?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

我们有一个运行在Jboss上的j2ee应用程序,我们希望监视它的内存使用情况。目前我们使用下面的代码

    System.gc();
    Runtime rt = Runtime.getRuntime();
    long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
    logger.information(this, "memory usage" + usedMB);

此代码工作正常。这意味着它显示出符合现实的记忆曲线。当我们从一个数据库创建一个大的xml文件时,曲线就会上升,提取完成后就会下降。

一位顾问告诉我们,显式调用gc()是错误的,“让jvm决定何时运行gc”。基本上他的论点和这里讨论的一样。但我仍然不明白:

  • 我怎么能有我的记忆使用曲线?
  • 明确的gc()有什么问题?我不在意使用明确的gc()可能发生的小的性能问题,我会在1-3%内估计这些问题。我需要的是内存和线程监视器,它可以帮助我分析客户站点上的系统。
提问于
用户回答回答于

如果你真的想看看虚拟机内存中发生了什么,你应该使用像VisualVM这样的好工具。这个软件是免费的,这是一个很好的方式来看看发生了什么。

明确的gc()调用没有什么是“wrong”。但是,请记住,当您调用gc()时,“suggesting”垃圾回收器正在运行。不能保证它会在您运行该命令的确切时间运行。

用户回答回答于

有些工具可以让你监控虚拟机的内存使用情况。该VM可以公开使用JMX内存统计信息。您也可以打印GC统计信息,查看内存在一段时间内的运行情况。

调用System.gc()可能会损害GC的性能,因为对象将过早地从新旧版本转移到旧版本,并且弱引用将被过早地清除。这会导致内存效率降低,GC时间延长以及缓存命中率下降(对于使用弱引用的缓存)。我同意你的顾问:System.gc()是不好的。我会尽可能使用命令行开关来禁用它

扫码关注云+社区