background image

Java 开发:JVM 设置对性能的影响

  一台后端 server,OS 为 Slackware 8.1,装了 tomcat 4.1.30,近期在繁忙时期经常会死
机,死状就是"java.lang.OutOfMemoryError  

: unable to create new native thread".是 tomcat 创

建不了新的线程来应答请求了。于是我搭了一个环境专门来测试这个问题。内存为
2G,CPU 为四颗 2.8G,tomcat 4.1.30,写一个最简单的 JSP 页面,如下:
  代码 
<%
  try
  {
  Thread.sleep(30000);
  out.println("fuck");
  } catch (InterruptedException e  

) {

  e.printStackTrace();
  } %> 

    然 后 开 Jmetor 来 压 , 同 时 开 jconsole 来 监 测 tomcat 的 情 况 , 并 不 断 调 整
XMX,XMS,XSS 这三个参数,得出下表:
  XMX XMS XSS down 时的 tomcat thread 数
  500M 500M 128K 642
  800M 800M 64K 485
  1024M 1024M 64K 374
  1024M 1024M 128K 374
  1024M 1024M 512K 371
  根据该表,可以看出,随 XMX,即是分配给 JVM 的内存数越大,tomcat 所能开的
thread 数就越小,而 Xss 这个参数几乎不影响任何测试结果。我猜想 tomcat 开线程是使用
linux 的内存,而不是 JVM 的内存。当分配给 JVM 的内存越大,操作系统所能用于分配的
内存就越小,于是所能开的线程数就越小。
  大家有什么解决方案吗?难道大家都没遇过这个问题?我的设想是可能 linux 初始每个
进程(也就是 tomcat 开的线程)有一个初始大小,这应该是一个内核参数来的,应该把它
调小就可以了,但我不知道怎样去调。