实战JAVA内存泄露问题(三)

2014-11-24 02:42:53 · 作者: · 浏览: 6
较大区别;

然后看到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上的多线程调度的性能完胜了:)

作者“ERDP技术架构”