使用实时Java进行开发,第2部分 改善服务质量 - 编程入门网
if (useSleep)
Thread.sleep(100);
BinaryTree newTree = createNewTree(15); // create full 15-level BinaryTree
this.map.put(new Integer(i), newTree);
}
} catch (InterruptedException e) {
stop = true;
}
}
public void initialize() {
this.map = new HashMap<Integer,BinaryTree>();
allocateSomeData(false);
System.out.println("\nFinished initializing\n");
}
public void run() {
while (!stop) {
allocateSomeData(true);
}
}
}
GCStressThread 通过 HashMap 维护一组 BinaryTree。它为存储新 BinaryTree 结构的 HashMap 迭代一组相同的 Integer 键,这些结构是完全填充的 15 级 BinaryTrees。(所以每个 BinaryTree 有 215 = 32,768 个节点被存储在 HashMap 中)。HashMap 在每次迭代时都持有 125 个 BinaryTree(活动数据),它每隔 10 毫秒就会将其中一个节点替换为新的 BinaryTree。通过这种方式,此数据结构维持着一个相当复杂的活动对象集,并且以特定速率生成垃圾。首先使用 initialize() 例程,借助 125 个 BinaryTree 来初始化HashMap,initialize() 例程不会在对每棵树的收集之间暂停。一旦启动了 GCStressThread(在启动服务器之前),它将通过服务器的工作者线程全权处理 TaskHandler 操作。 我们不打算使用客户端来驱动此服务器。我们将直接在服务器的主循环(在 Server.start() 方法中)中创建 NUM_OPERATIONS == 10000 操作。清单 8 给出了 Server.start() 方法: 清单 8. 在服务器内部分派操作
使用实时Java进行开发,第2部分 改善服务质量(7)时间:2011-01-27 IBM Mark Stoodley如果我们收集完成每个 TaskHandler.run() 调用的时间统计信息,我们可以看到 JVM 和应用程序设计引入了多少易变性。我们使用具有 8 个物理核心的 IBM xServer e5440,安装了 Red Hat RHEL MRG 实时操作系统。(禁用了超线程。注意,尽管超线程可以在基准测试中提供一些吞吐量改进,但是由于其虚拟核心并不完整,所以在启用超线程的处理器上的操作的物理核心性能可能具有明显不同的计时)。当在 8 核心机器上使用 IBM Java6 SR3 JVM 和 6 个线程运行此服务器时(我们将一个核心保留给 Server 主线程,另一个核心供 GCStressorThread 使用),我们得到了以下(代表性的)结果:
可以看到,几乎所有操作都在 10 毫秒内完成,但是一些操作花了超过半秒(长 50 倍)的时间。这个差异太大了!我们 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |