我对在服务器应用程序中观察到的问题感到非常困惑。
-Xss256k -Xmx8192m -XX:+UseG1GC -XX:MaxGCPauseMillis=20
主用例在一个java进程中接收CORBA请求,并通过在WildFly中调用远程EJB进行处理来委托它们。 1
由于此类并行请求数量很多,我们将WildFly配置的ejb3.0子系统中的远程连接增加到1000:<max-threads count="1000" />
现在,我们观察到的奇怪的事情是堆大小(例如通过VisualVM观察)是8G设置并且GC持续运行,因此使用大约6-7GB的堆并且线程数与设置。内存和线程都不会随着时间的推移而增加。同时,在运行一段时间后用top
观察PID,我们看到使用了惊人的42G!
有人可以解释一下,java进程如何消耗比X JVM属性设置的内存更多的内存?
1 我知道我们在这里谈论的是非常古老的技术,但是应用程序就是这样,我们无法在不久的将来改变它。它必须在生产中存活一段时间,直到我们有机会升级到更新的技术。