只是一个想法:NIO缓冲区位于JVM外部。
编辑: 根据2016年,值得考虑@Lari Hotari评论即使堆等大小稳定时,为什么Sun
JVM仍继续消耗更多的RSS内存?,因为回到2009年,RHEL4的glibc <2.10(〜2.3)
为什么会这样呢?“幕后”发生了什么?
JVM使用的内存不仅仅是堆。例如,Java方法,线程堆栈和本机句柄与堆以及JVM内部数据结构分开分配在内存中。
在您的情况下,可能的麻烦原因可能是:NIO(已经提到),JNI(已经提到),过多的线程创建。
关于JNI,您曾写道该应用程序未使用JNI,但是…您正在使用哪种类型的JDBC驱动程序?可能是2型泄漏吗?但是,正如您所说的那样,数据库使用率很低是非常不可能的。
关于过多的线程创建,每个线程都有自己的堆栈,该堆栈可能很大。堆栈大小实际上取决于VM,OS和体系结构,例如对于JRockit,Linux x64上的堆栈大小为256K,我在Sun文档中没有找到有关Sun VM的参考。这直接影响线程内存(线程内存=线程堆栈大小*线程数)。而且,如果您创建和销毁大量线程,则内存可能不会被重用。
如何控制JVM的实际内存消耗?
老实说,对我而言,成百上千的线程似乎是巨大的。也就是说,如果您确实需要那么多线程,则可以通过该-Xss选项配置线程堆栈大小。这样可以减少内存消耗。但是我认为这不会解决整个问题。我倾向于认为当我查看实际内存图时,某处会有泄漏。
问候。



