【问题标题】:Java profiling for scalability and time complexity用于可伸缩性和时间复杂性的 Java 分析
【发布时间】:2012-07-07 14:09:17
【问题描述】:

我正在开发一个具有生产者-消费者模式的 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 个锁而增加了吞吐量(这看起来在纸上)?这是我希望看到和证明的一个重要方面。

谢谢

【问题讨论】:

    标签: java multithreading profiling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      希望这会有所帮助。

      【讨论】:

      • 会看看,让你确定。但是我会衡量什么指标来说明我的应用程序的吞吐量增加了?你也用过 eclipse 吗?
      • 嗨 - 如果您使用 maven(对于 perf4j 或 codahale 指标),它会更简单。对于 perf4j,您应该能够只下载 jar 文件并继续,除非我的记忆力让我失望。对于简单的测试,在与他人分享时,使用最小/最大/标准偏差/计数(尽可能以图形格式)将有助于您的案例。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-09-23
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多