我们开发了一个CPU高度密集型的Java服务器应用程序,它有一个严重的内存泄漏(至少看起来是这样)。随着时间的推移,应用程序似乎会消耗越来越多的内存(如Windows任务管理器所见),但如果我使用专门的Java分析器对其进行分析,内存似乎会保持不变。例如,在任务管理器中,我看到应用程序占用了超过8 2gb的内存并且还在不断增长,但在Java分析器中,我看到堆内存最多为2 2gb。我尝试了所有可能的JAVA_OPTS组合(-Xmx,-Xms,所有类型的GC),但都不起作用,是不是Java进程没有将内存释放回操作系统?有没有办法迫使它这么做呢?
发布于 2014-10-08 23:01:09
1)
我建议您设置-Xmx2100m并观察负载下的堆使用情况。
JVM可能会占用尽可能多的OS内存,直到它达到Xmx限制。在现代JVM中,默认的Xmx是根据操作系统中可用的总内存来计算的,因此它可能是一个很大的值。
我认为你的应用程序没有内存泄漏,你的JVM只是分配了大量内存,因为它可以。
通过jvisualvm观察您的JVM。
2)
第二个建议--你使用JNI代码吗?您的应用程序是否调用任何本机库(即。windows下的dll )?
https://stackoverflow.com/questions/26259099
复制相似问题