Java内存在任务管理器中增加,但在探查器中不增加

Java内存在任务管理器中增加,但在探查器中不增加,java,memory-leaks,Java,Memory Leaks,我们开发了一个高度CPU密集的Java服务器应用程序,该应用程序存在严重的内存泄漏(或者看起来是这样)。随着时间的推移,应用程序似乎消耗了越来越多的内存(如Windows任务管理器所示),但如果我用专门的Java分析器对其进行分析,内存似乎保持不变。例如,在TaskManager中,我看到应用程序占用了超过8gb的内存并在增长,但在Java profiler中,我看到堆内存最多为2gb。我尝试了所有可能的JAVA_选项组合(-Xmx,-Xms,所有类型的GC),但没有任何效果,JAVA进程是否没

我们开发了一个高度CPU密集的Java服务器应用程序,该应用程序存在严重的内存泄漏(或者看起来是这样)。随着时间的推移,应用程序似乎消耗了越来越多的内存(如Windows任务管理器所示),但如果我用专门的Java分析器对其进行分析,内存似乎保持不变。例如,在TaskManager中,我看到应用程序占用了超过8gb的内存并在增长,但在Java profiler中,我看到堆内存最多为2gb。我尝试了所有可能的JAVA_选项组合(-Xmx,-Xms,所有类型的GC),但没有任何效果,JAVA进程是否没有将内存释放回操作系统?有没有办法强迫它这样做?

1)

我建议您设置
-Xmx2100m
,并观察负载下的堆使用情况

JVM可能需要尽可能多的操作系统内存,直到达到Xmx限制。在现代JVM中,默认的Xmx是根据操作系统中可用的总内存计算的,所以它可能是一个很大的值

我认为你的应用程序没有内存泄漏,你的JVM只是分配了很多内存,因为它可以

通过jvisualvm观察JVM

(二)


第二个建议-您是否使用任何JNI代码?您的应用程序是否调用了任何本机库(即windows下的dll)?

也许,漏洞在JVM perm gen中,它不算是堆的一部分。JVM报告的perm gen大小如何?perm gen大小恒定在90mb左右,所以我猜这不是问题:)您可以从命令行强制gc,看看它是否改变了什么:另外,您使用的JVM是什么?是甲骨文吗?是的,是甲骨文。运行GC会在探查器中显示堆内存下降,但在任务管理器中没有变化。一旦JVM从操作系统分配了一些内存,它就不会很快释放内存。JVM有很多优化规则,如果我需要在需要之前有很多时间堆,我将来会需要它。是的,它确实有一些C++函数的JNI调用。C++函数是无内存泄漏的。