循环内的 Java 执行时间峰值
Posted
技术标签:
【中文标题】循环内的 Java 执行时间峰值【英文标题】:Java Execution Time Peaks within a Loop 【发布时间】:2016-05-20 12:38:18 【问题描述】:我有一个循环,其中包含 701 次类似复杂计算的迭代。我测量了三次运行的每次迭代的执行时间。正如你在图表中看到的那样,我得到了奇怪的峰值。是否有任何通用方法能够在不分析循环内代码的情况下解释这些峰值。 Execution Time
gc 是否有可能从这些点开始并减慢其他部分的速度?
【问题讨论】:
视情况而定。如果您不想分析循环内的代码,则必须分析执行期间的内存使用情况。 此外,JIT 编译器很可能会启动并热编译代码。欲了解更多信息,您可能需要阅读this question about micro-benchmarks。 我还没有时间关注你的链接,但我跟踪了使用的内存((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/1000000)
在持续时间达到峰值时,gc 似乎完成了他的工作:frameNo:77,帧写入时间:34.94403,内存使用量:687mb frameNo:78,帧写入时间:724.741449,内存使用量:107mb
@BastianHermann 是的,这似乎是一个完整的 gc。如果您想了解更多信息,请使用日志...Luke... ;)
【参考方案1】:
这取决于。
如果您不想分析循环内的代码,则至少必须分析执行期间的内存使用情况。例如,如果算法不会产生很多垃圾并且您已经配置了足够的堆并且您选择了正确的 gc 算法,那么 gc 不需要任何“停止世界”。
首先,您必须激活 gc 日志记录(请参阅此处:http://www.oracle.com/technetwork/articles/javase/gcportal-136937.html)并检查与您的时间峰值相对应的 gc 峰值。
如果你想分析gc日志你可以使用这个工具http://www.tagtraum.com/gcviewer.html。
然后点击 Turing85 发布的关于微基准的链接。更完整。
【讨论】:
以上是关于循环内的 Java 执行时间峰值的主要内容,如果未能解决你的问题,请参考以下文章