我们有一个运行在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”。基本上,他的观点与disscussed here是一样的。但我还是不明白:
发布于 2009-06-29 15:46:35
如果您想真正了解VM内存中发生了什么,您应该使用像VisualVM这样的好工具。这是一个自由软件,这是一个很好的方式来了解正在发生的事情。
显式gc()
调用没有什么真正的“错误”。但是,请记住,当您调用gc()
时,您是在“建议”运行垃圾收集器。不能保证它将在您运行该命令的确切时间运行。
发布于 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。
发布于 2014-07-04 02:29:36
你可以看看stagemonitor。它是一个开源的java (web)应用程序性能监视器。它捕获响应时间指标、JVM指标、请求细节(包括由请求分析器捕获的调用堆栈)等。开销非常低。
您还可以选择使用强大的timeseries数据库石墨来存储数据点的长期历史记录,您可以使用花哨的仪表板查看这些数据点。
示例:
查看project website以查看屏幕截图、功能描述和文档。
注:我是stagemonitor的开发者
https://stackoverflow.com/questions/1058991
复制相似问题