如何监控Java内存使用情况?
如何监控Java内存使用情况?
我们有一个运行在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()有什么问题?我不关心可能发生的少量性能问题,我预计这些问题只占1-3%。我需要的是内存和线程监视器,以帮助我分析我们在客户现场的系统。
admin 更改状态以发布 2023年5月23日
如果您想真正了解虚拟机内存中正在发生的情况,应该使用像VisualVM这样的好工具。这是免费软件,是观察发生的情况的好方法。
显式调用gc()
没有什么“问题”。但是,请记住,当您调用gc()
时,您只是“建议”垃圾收集器运行。不能保证它将在您运行该命令的确切时间运行。