Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
监视Java内部对象&;内存使用_Java_Memory_Out Of Memory_Tomcat8 - Fatal编程技术网

监视Java内部对象&;内存使用

监视Java内部对象&;内存使用,java,memory,out-of-memory,tomcat8,Java,Memory,Out Of Memory,Tomcat8,我有一个Java web服务器作为Windows服务运行。 我在Java1.8中使用Tomcat8* 几个月来,我发现内存使用量增长非常快。我不能确定它是堆还是堆。 这个过程从大约200MB开始,大约一周后,它可以达到2GB。 之后不久,它将生成OutOfMemory异常(内存使用量将为2GB-2.5GB)。 这在多个环境中重复了多次 我想知道是否有一种方法可以监控进程并查看其内部内存使用情况,甚至可以查看哪些对象使用了最多的内存。 “Java本机内存跟踪”可以用于此目的吗? 这将帮助我检测可能

我有一个Java web服务器作为Windows服务运行。 我在Java1.8中使用Tomcat8* 几个月来,我发现内存使用量增长非常快。我不能确定它是堆还是堆。 这个过程从大约200MB开始,大约一周后,它可以达到2GB。 之后不久,它将生成OutOfMemory异常(内存使用量将为2GB-2.5GB)。 这在多个环境中重复了多次

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


提前感谢。

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

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

引用:

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

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


或者,您可以将nashorn连接到命令行,或者通过jjs运行您的程序,使用JVisualVM—它与JDK捆绑在一起。虽然2GB对于一个Web服务器来说并没有那么多…@Boristeider,我同意这并不多,但它确实崩溃了。我发现了“Java本机内存跟踪”,你熟悉吗?它是堆,当堆栈用完时,你有一个非常奇怪的Java程序。除了visualvm:还随java 8一起提供。@zapl,为了记录我的服务器,我应该只添加JVM参数吗?或者向Java任务控制添加一个新的JVM连接?是否更倾向于使用“Java任务控制”?记录飞行?我从来没用过飞行记录器。我的理解是,这是一个商业JVM功能,需要许可证,我在回答中提到的免费工具对我来说效果很好。我能将监控导出到日志文件吗?