监控Java内部对象&内存使用情况

时间:2016-06-05 10:53:24

标签: java memory out-of-memory tomcat8

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

引用:

  

这个过程从~200MB开始,大约一周后,它可以达到2GB。在它产生OutOfMemory异常后不久(内存使用量将为2GB - 2.5GB)。

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

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