0

我正在开发一个具有生产者-消费者模式的 Java 应用程序。早些时候,生产者没有按顺序产生事件(例如,在“1”之前产生了“2”),但消费者必须按顺序发送它们(例如,“1”然后是“2”然后是“3”等)。为了说明这一点,A TreeSet 被用来维护一个队列,并且正在对其进行按顺序遍历以查看和删除元素。到目前为止,一切都很好。改变的是 Producer 现在按顺序生成事件,因此我决定使用:-

a) LinkedBlockingQueue(它具有队列的基本属性,其中只能访问第一个和最后一个元素,就像在队列中一样)。

b) 使用 LBQ 将我从树集中的 O(log n) 带到 O(1)。

c) 我不再需要编写显式同步,ReentrantLock 负责 LBQ 的 put 和 take 方法。

d) 我不再需要写一个显式的等待/通知,LBQ 会处理这个。

e) LBQ 有 2 个锁,因此 put 和 take 可以同时在不同的 CPU 上进行。

f) LBQ 使用 CAS 来维护等待线程的队列。

在我看来,一切都很好。但我被卡住了,这里有以下问题: -

a) 我需要能够通过收集一些指标来证明使用 LBQ 优于 TreeSet 的优势。我应该在我的 Eclipse 中使用哪个免费的分析器来继续?Visual VM 很好,但是还有更好的选择吗?(Introscope 将用于我的应用程序的显式运行,而不是在我的本地 Eclipse 上,这是我无法抗拒的约束,TPTP 被拒绝)。

b) 我如何证明由于在 LinkedBlockingQueue 中使用了 2 个锁而增加了吞吐量(这在纸上看起来是有的)?这是我想看到和证明的一个重要方面。

谢谢

4

3 回答 3

0

我已经使用JMeter进行了类似的负载测试。它也可以(但我没有这样做)轻松计算吞吐量。就我而言,我必须编写一个 Java Request Java Request Sampler,它充当我被测系统的客户端。JMeter 的侦听器可以很容易地绘制Java Request Sampler 的结果(并且这些侦听器确实显示了吞吐量)。听起来您可能需要这样做。他们确实有用于 TCP、HTTP 等的开箱即用的采样器,尽管您可以使用它们。

于 2012-07-08T19:29:09.050 回答
0

想知道您是否查看过 perf4j(连同它的图形统计附加程序)来测量/显示性能统计信息 (http://perf4j.codehaus.org/)。如果由于某种原因不可行,请分享原因,因为它可能有用。

此外,可以查看指标(http://metrics.codahale.com/)以及 heapster 和 ostrich 的组合(如果可能的话)用于堆/性能测量(https://github.com/mariusaeriksen /堆)。使用指标,您可以依赖石墨或神经节进行显示(如果不使用 JMX)。

希望这可以帮助。

于 2012-07-07T14:23:14.910 回答
0

如果您想可视化内存/线程使用,您可以尝试使用可视化 vm 或 netbeans 分析器。

于 2012-07-07T14:27:23.757 回答