代码之家  ›  专栏  ›  技术社区  ›  Dan

Java评测、性能调优和内存评测练习

  •  15
  • Dan  · 技术社区  · 14 年前

    我将举办一个研讨会,介绍如何使用java应用程序的评测、性能调优、内存评测、内存泄漏检测等 JProfiler Eclipse Tptp. 我需要一套练习,我可以提供给参与者,他们可以: 使用该工具来分析和发现问题:瓶颈,内存泄漏,次优代码等。我相信有大量的经验和现实生活中的例子。

    • 解决问题并实现优化的代码
    • 通过执行另一个分析会话来演示解决方案

    问题和解决办法不应过于复杂;最好几分钟就能解决,最坏几小时就能解决。 一些有趣的练习领域:

    • 解决内存泄漏
    • 优化循环
    • 优化字符串操作
    • 解决由并发和并发瓶颈加剧的问题

    理想情况下,练习应该包括示例未优化代码和解决方案代码。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Sandor Murakozi    14 年前

    我试图找到我在野外看到的真实生活的例子(可能有点改变,但基本问题都是非常真实的)。我还尝试将它们围绕同一场景进行集群,这样您就可以轻松地构建会话。

    场景:您有一个耗时的函数,您想为不同的值执行多次,但相同的值可能会再次弹出(理想情况下,在创建后不会太久)。一个好而简单的例子是需要下载和处理的url-web-page对(对于练习来说,它应该是模拟的)。

    • 你要检查页面中是否有一组单词弹出。在循环中使用函数,但使用相同的值,伪代码:

      for (word : words) {
          checkWord(download(url))
      }
      

      一个解决方案非常简单,只需在循环之前下载页面。 其他解决方案如下。

    内存泄漏:

    • 简单的一点:你也可以用一种缓存来解决你的问题。在最简单的情况下,您可以将结果放到(静态)映射中。但如果你不阻止它,它的大小将无限增长->内存泄漏。
      可能的解决方案:使用LRU地图。很可能性能不会降低太多,但内存泄漏应该会消失。
    • WeakHashMap ,其中键是URL(不是字符串,请稍后参阅),值是包含URL、下载页和其他内容的类的实例。您可以假设它应该是好的,但事实并非如此:因为值(不是弱引用的)引用了键(URL),所以键永远没有资格清理->不错的内存泄漏。
    • 和以前一样,但是url是内部字符串(“如果我们碰巧又有相同的字符串,为了节省一些内存”),值不引用这个。我没有试过,但在我看来,它也会导致泄漏,因为内部字符串不能被GC-ed。
      解决办法:不要实习,这也会引出你千万不要跳过的建议:不要实习 premature optimization, as it is the root of all evil .


    • 解决方案:对结果使用StringBuilder。

    并发性:

    • 你想通过并行下载/过滤来加速整个过程。创建一些线程并使用它们运行代码,但是在一个大的同步块(基于缓存)中执行所有操作,只是“保护缓存不受并发问题的影响”。其效果应该是您只有效地使用一个线程,因为所有其他线程都在等待获取缓存上的锁。
      解决方案:仅围绕缓存操作进行同步(例如,使用`java.util.collections.synchronizedMap())

    • 寓意:同步不应该是一件临时的事情,在“不会伤害”的基础上,而是一件深思熟虑的事情。

    奖励练习:

    小的 漏到某处。通常这种模式不太容易捕捉。您可以使用探查器的“书签”或“水印”功能,它应该在缓存完成后立即创建。

        2
  •  1
  •   Community miroxlav    7 年前

    不要忽视 this method these reasons . 一个例子是 here . 另外,尝试使用具有I/O和重要调用深度的示例。不要只使用像Mandelbrot这样的cpu受限的小程序。如果您以C为例,它不是太大,并用Java重新编码它,这应该可以说明您的大部分观点。

    让我们看看:

    • 解决内存泄漏。

    • 优化循环。
      一般来说,循环不需要优化,除非在它们内部做的很少(而且它们占用了很长的时间)。

    • 优化对象创建和管理。

    • 优化字符串操作。
      使用字符串生成器,但不要浪费不占用固定执行时间百分比的代码。

    • 并发性。
      并发有两个目的。
      工作到允许多个硬件同时启动的程度。如果硬件不在那里,那就没用了。很疼。
      2) 表达式的清晰性,因此例如UI代码不必同时担心繁重的计算或网络I/O。

    在任何情况下,这是不够强调,不要做任何优化之前,你已经证明了一些东西需要显着%的时间。