我想我可能在 jetty 8.1.7 生产中运行的 servlet 应用程序中存在内存泄漏。
- 有没有办法查看在某个时间实例实际使用了多少堆内存,而不是使用 -Xmx 分配的最大内存,而是实际使用的内存量。
- 我可以强制为在码头内运行的应用程序进行垃圾收集吗
我想我可能在 jetty 8.1.7 生产中运行的 servlet 应用程序中存在内存泄漏。
是的,两者都可以通过以下方式轻松实现:(VisualVM
请参阅:http ://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/monitor_tab.html )默认情况下,这个是 Oracle JDK 附带的(=> 否需要额外安装)
但是对于内存泄漏检测,我建议进行内存转储并稍后使用eclipse MAT
( http://www.eclipse.org/mat/ ) 对其进行分析,因为它具有相当不错的 UI 可视化 java 内存转储。
编辑:
对于仅 ssh 访问,是的,您可以使用上述两个工具。但是,您需要在运行窗口管理器的机器上运行它们,并通过 ssh 远程连接到另一台机器(您需要在这两台机器上都有 java):
visualVM
:您需要VisualVM
在一台机器上运行并通过 ssh 连接到远程机器,请参阅:VisualVM over ssh jmap
(示例用法参见: http: //kadirsert.blogspot.de/2012/01 / ...)然后下载转储文件并在本地加载到eclipse MAT
你可以打电话System.gc()
。这通常会执行完整的 GC ......但可以禁用此工具。(有一个 JVM 选项可以使用 HotSpot JVM 执行此操作。)
但是,如果您的问题是内存泄漏,那么运行 GC 将无济于事。事实上,它可能会使您的服务器比现在更慢。
您还可以监控内存使用情况(以多种方式 - 请参阅其他答案),但这只会为您提供内存泄漏可能泄漏的证据。
您真正需要做的是找到并修复内存泄漏的原因。
参考:
启用 jmx 并使用 jconsole 连接到它
您可以使用 %JAVA_HOME%\bin 文件夹下的 jvisualvm.exe。通过使用此应用程序,您可以监控内存使用情况并可以强制 gc。