实战JAVA内存泄漏问题4-java的wait(5)在Linux 2.4和2.6上的性能差异

老枪 发布于 2010/12/13 09:11
阅读 206
收藏 0

实战java内存泄露问 2-解决方案 里面说了,主要的一个解决思路是提高事件处理的速度,有一个情况是同一个版本的代码在我们的DEV和QA/UAT/PROD的处理速度始终不一致,即使把所有相关的配置(主要是数据源)都配成一样的,还是有较大区别;

然后看到DEV是Linux 2.6的,其他环境是Linux 2.4的;这是一个较大的差异,但是具体这个2.4和2.6对我们JAVA代码的区别,一开始并不明白;后来才具体跟踪发现:

wait(5)这行代码在Linux 2.4和Linux 2.6下面会有很大的性能差异;

//当然根据分析这个情况其实是可以跳过的。。

在某一步,可能会执行到如下代码,就是在一定情况下会等待

 
synchronized(o)
 
{
 
try {
 
o.wait(5);
 
} catch (InterruptedException e) {
 
// TODO Auto-generated catch block
 
e.printStackTrace();
 
}
 
}

按照JDK的说明,这行代码的意思是,如果有其他线程调用这个对象的notify()或者是notifyall()方法,那么wait(5)结束;如果没有被Notify()或者notifyall()的话,那么超时后结束,这里的话就是5ms后结束;

2. 然而实测发现,在Linux 2.4和Linux 2.6上,这段代码会产生较大的性能差异;

测试方法,运行下面的WaitTimeTest代码500次,然后用脚本统计平均时间

package com.hetaoblog.demo;
 
public class WaitTimeTest {
 
/**
* @param args
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
 
for(int i = 0; i < 100; ++i)
{
long t1 = System.currentTimeMillis();
 
WaitTimeTest o = new WaitTimeTest();
 
synchronized(o)
{
try {
o.wait(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 
System.out.println("wait(5) used time: " + (System.currentTimeMillis() - t1));
}
 
}
 
 
 
}

测试环境:

JRE: J2RE 5.0 IBM J9 2.3 Linux x86

OS: Redhat As系列

CPU:x86系列的4个cpu

测试结果

平均时间(ms)
2.4 14.8
2.6 6.1

就其原因,按我的理解是因为Linux 2.4和2.6内核调度算法从o(n)改到o(1),以及使用新的线程库NPTL的改进,使得2.6在多CPU,多线程环境下性能提高很多

http://www.ibm.com/developerworks/cn/linux/l-web26/index.html

另外,我在自己的T60,winxp上测了下sun的jdk,这个wait(5)基本需要16ms的时间;

这说明这3个环境下,IBM的JDK在2.6上的多线程调度的性能完胜了:)

加载中
0
核桃博客
核桃博客

帅哥,转载我欢迎,不过,我在我的文章前面写的很清楚,如果可以修改原文的话麻烦你修改下吧?

作者: 核桃博客 本文网址:http://www.hetaoblog.com/java-memory-leak-wait-difference-linux-2-4-2-6/
本博客所有文章全部原创,欢迎转载,  但必须以超链接形式标明文章原始出处和作者信息

返回顶部
顶部