我有一个作为Windows服务运行的Java Web服务器。 我在Java 1.8中使用Tomcat 8。* 几个月以来,我发现内存使用量正在迅速增加。我无法确定它是堆还是堆栈。 这个过程从大约200MB开始,大约一周后,它可以达到2GB。 在它产生OutOfMemory异常后不久(内存使用量将为2GB - 2.5GB)。 这在多种环境中重复多次。
我想知道是否有一种方法来监视进程并查看它的内部内存使用情况,甚至是查看哪些对象使用最多内存的级别。 可以使用“Java Native Memory Tracking”吗? 这将帮助我检测可能导致此问题的任何内存泄漏。
提前致谢。
答案 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