我们开发了一个高度CPU密集型的Java服务器应用程序,它具有严重的内存泄漏(或者看起来似乎如此)。随着时间的推移,应用程序似乎占用了越来越多的内存(如Windows任务管理器所示),但如果我分析它是一个专门的Java分析器,内存似乎保持不变。例如,在任务管理器中,我看到应用程序占用了超过8GB的内存并且在不断增长,但在Java分析器中,我看到堆内存最多为2GB。我尝试了所有可能的JAVA_OPTS组合(-Xmx,-Xms,所有类型的GC)并没有任何效果,Java进程是不是将内存释放回操作系统?有没有办法强迫它这样做?
答案 0 :(得分:1)
1)
我建议您设置-Xmx2100m
并观察加载时的堆使用情况。
JVM可能会占用尽可能多的操作系统内存,直到达到Xmx限制为止。在现代JVM中,默认Xmx是根据OS中可用的总内存计算的,因此它可能是大值。
我认为你的应用没有内存泄漏,你的JVM只是分配了大量的内存,因为它可以。
通过jvisualvm观察您的JVM。
2)
第二个建议 - 你使用任何JNI代码吗?你的应用程序是否调用任何本机库(即windows下的dll)?