Dan*_*Dan 15 java optimization performance profiling memory-leaks
我即将使用JProfiler和Eclipse Tptp进行java应用程序的研讨会分析,性能调优,内存分析,内存泄漏检测等. 我需要一些练习,我可以提供给参与者,他们可以:使用工具来分析发现问题:瓶颈,内存泄漏,次优代码等.我相信有丰富的经验和现实生活中的例子.
问题和解决方案不应过于复杂; 应该可以在几分钟内解决它们,最坏的情况是几小时.一些有趣的锻炼领域:
理想情况下,练习应包括样本未优化代码和解决方案代码.
我试图找到我在野外看到的现实生活中的例子(可能略有改变,但基本问题都非常真实).我也试图将它们聚集在同一场景中,这样你就可以轻松地建立一个会话.
场景:您有一个耗时的功能,您希望对不同的值执行多次,但可能会再次弹出相同的值(理想情况下,创建后不会太长).一个好的和简单的例子是您需要下载和处理的url-web页面对(对于练习它应该可能被模拟).
循环:
您想要检查页面中是否弹出任何一组单词.在循环中使用您的函数,但具有相同的值,伪代码:
for (word : words) {
checkWord(download(url))
}
Run Code Online (Sandbox Code Playgroud)
一个解决方案非常简单,只需在循环之前下载页面即可.其他解决方案如下.
内存泄漏:
WeakHashMap
,其中键是URL(不是字符串,请参见后面),值是包含URL的类的实例,下载的页面和其他内容.您可能认为它应该没问题,但实际上它不是:因为值(不是弱引用)具有对键(URL)的引用,键永远不会有资格清理 - >内存泄漏.对象创建和字符串:
并发:
您希望通过并行下载/过滤来加速整个过程.创建一些线程并使用它们运行代码,但是在一个大的同步块(基于缓存)中执行所有操作,只是"保护缓存免受并发问题".效果应该是你有效地只使用一个线程,因为所有其他线程都在等待获取缓存上的锁.
解决方案:仅围绕缓存操作进行同步(例如,使用`java.util.collections.synchronizedMap())
同步所有微小的代码片段.这应该会破坏性能,可能会阻止正常的并行执行.如果你足够幸运/聪明,你也可以拿出死锁.这样做的道德:同步不应该是一个临时的事情,在"它不会伤害"的基础上,而是一个深思熟虑的事情.
奖金锻炼:
在开始时填写你的缓存,之后不要做太多的分配,但在某处仍然有一个小的泄漏.通常这种模式不容易捕捉.您可以使用分析器的"书签"或"水印"功能,该功能应在缓存完成后立即创建.