0

我想我可能在 jetty 8.1.7 生产中运行的 servlet 应用程序中存在内存泄漏。

  1. 有没有办法查看在某个时间实例实际使用了多少堆内存,而不是使用 -Xmx 分配的最大内存,而是实际使用的内存量。
  2. 我可以强制为在码头内运行的应用程序进行垃圾收集吗
4

4 回答 4

2

是的,两者都可以通过以下方式轻松实现:(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
于 2013-01-22T14:57:46.400 回答
0

你可以打电话System.gc()。这通常会执行完整的 GC ......但可以禁用此工具。(有一个 JVM 选项可以使用 HotSpot JVM 执行此操作。)

但是,如果您的问题是内存泄漏,那么运行 GC 将无济于事。事实上,它可能会使您的服务器比现在更慢。

您还可以监控内存使用情况(以多种方式 - 请参阅其他答案),但这只会为您提供内存泄漏可能泄漏的证据。

您真正需要做的是找到并修复内存泄漏的原因

参考:

于 2013-01-22T15:03:56.553 回答
0

启用 jmx 并使用 jconsole 连接到它

http://wiki.eclipse.org/Jetty/Tutorial/JMX

于 2013-01-22T15:05:37.077 回答
0

您可以使用 %JAVA_HOME%\bin 文件夹下的 jvisualvm.exe。通过使用此应用程序,您可以监控内存使用情况并可以强制 gc。

于 2013-01-22T15:42:28.097 回答