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

Monitoring Java internal objects & memory usage

我有一个 Java 网络服务器 运行 作为 Windows 服务。 我使用 Tomcat 8 和 Java 1.8.* 几个月来,我发现内存使用量正在迅速增加。我无法确定它是堆还是堆栈。 该进程从大约 200MB 开始,大约一周后,它可以达到 2GB。 不久之后它会产生 OutOfMemory 异常(内存使用量将是 2GB - 2.5GB)。 这已在多个环境中重复多次。

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

提前致谢。

要监视 Java 进程的内存使用情况,我会使用 JVisualVM 等 JMX 客户端,它与 Oracle JDK:

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

为了确定内存泄漏的原因,我会指示 JVM 在内存不足时进行堆转储(在 Oracle JVM 上,这可以通过指定 -XX:-HeapDumpOnOutOfMemoryError when starting your Java program), and then analyze that heap dump using a tool such as Eclipse MAT 来完成。

引用:

the process starts with ~200MB and after a week or so, it can reach up to 2GB. Shortly after it will generate OutOfMemory exception (the memory usage will be 2GB - 2.5GB).

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

或者你可以将 nashorn 连接到命令行或 运行 你的程序通过 jjs https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html