伙计们,上周在一个大型客户站点的 Java 服务器应用程序的负载测试研讨会期间,我们在使用 64 位 JVM 时只能运行大约 1300-1800 个并发会话,而在相同的配置下,我们能够运行 2800 个并发会话使用 32 位 JVM。
环境信息:Solaris 10、Java 1.6.0_30、Jetty 8.1.5、Web 应用程序是 I/O 绑定的,每个进程有 1000 个大部分空闲线程,生成了 6-12 个 Java 进程,差别不大,内存 16GB 未满故障时间,CPU 容量小于 50%,文件描述符设置为 65536。
当使用 64 位 JVM 运行时,我们达到了一个状态,即 CPU 低于 50%,机器级别和 Java 进程级别的大量内存仍然可用。至此,我们开始在产品的各个层获得“IOException”和“EOFException”。据我们所知,此时没有真正的网络或通信问题。似乎 Solaris 机器耗尽了与套接字通信相关的一些资源,并且看起来 64 位 JVM 消耗的资源是 32 位 JVM 的两倍。
有任何想法吗 ?一个显着的区别是 64 位 JVM 每个线程堆栈消耗 1024k,而 32 位 JVM 每个线程仅消耗 512k。这可能是原因吗?线程堆栈和套接字 I/O 是否从 Solaris 上的同一个内存池分配?这个池子可以增加吗?我们应该尝试将 64 位 VM 上的线程堆栈大小减少到 512k 吗?