监视 Java 内部对象和内存使用情况



我有一个作为Windows服务运行的Java Web服务器。我将Tomcat 8与Java 1.8一起使用。几个月来,我检测到内存使用量正在迅速增加。我无法确定它是堆还是堆。该过程从~200MB开始,一周左右后,它可以达到2GB。不久之后,它将生成内存不足异常(内存使用量将为 2GB - 2.5GB)。这在多个环境中重复了多次。

我想知道是否有办法监视进程并查看其内部内存使用情况,甚至可以查看哪些对象使用最多的内存。"Java 本机内存跟踪"可以用于此吗?这将帮助我检测可能导致此问题的任何内存泄漏。

提前谢谢。

为了监控Java进程的内存使用情况,我会使用JMX客户端,如JVisualVM,它与Oracle JDK捆绑在一起:

https://visualvm.java.net/jmx_connections.html

为了确定内存泄漏的原因,我会指示 JVM 在内存不足时进行堆转储(在 Oracle JVM 上,这可以通过在启动 Java 程序时指定-XX:-HeapDumpOnOutOfMemoryError来实现),然后使用 Eclipse MAT 等工具分析该堆转储。

引用:

该过程从~200MB开始,一周左右后,它可以达到2GB。不久之后,它将生成内存不足异常(内存使用量将为 2GB - 2.5GB)。

问题可能不像查看您在JVisualVM中获得了哪些java对象那么简单(例如数百万个字符串)您需要做的是识别泄漏的代码。一种方法是强制执行特定代码,然后监视内存。强制在类/对象中执行代码的最简单方法是使用像 https://github.com/lorenzoongithub/nudge4j 这样的工具(特别是因为你使用的是java 8)

或者,您可以将 Nashorn 连接到命令行或通过 JJS 运行您的 progam https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html

最新更新