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

17 浏览
0 Comments

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

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

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

这个代码运行得很好。这意味着它显示的内存曲线与实际情况相符。当我们从数据库创建一个大的xml文件时,曲线会上升,当提取完成后,它会下降。

\"alt

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

  • 我如何得到内存使用曲线?
  • 显式调用gc()有什么问题?我不关心可能发生的少量性能问题,我预计这些问题只占1-3%。我需要的是内存和线程监视器,以帮助我分析我们在客户现场的系统。
admin 更改状态以发布 2023年5月23日
0
0 Comments

有一些工具可以让您监视虚拟机的内存使用情况。虚拟机可以使用JMX公开内存统计信息。您还可以通过打印垃圾收集统计信息来查看内存随时间的表现。

调用System.gc()可能会损害垃圾收集器的性能,因为对象将过早地被移动到旧的代,弱引用将过早地被清除。这可能会导致内存效率降低,垃圾收集时间变长以及缓存命中率降低(对于使用弱引用的缓存)。我同意你的顾问:System.gc()是不好的。我会进一步使用命令行开关禁用它。

0
0 Comments

如果您想真正了解虚拟机内存中正在发生的情况,应该使用像VisualVM这样的好工具。这是免费软件,是观察发生的情况的好方法。

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

0