我正在执行不同排序算法的分析。目前我正在分析插入排序和快速排序。作为分析的一部分,我需要测量内存消耗。
我正在使用Visual VM进行性能分析。但是,当我为随机数据集执行插入排序时,假设70,000,我获得了不同的堆内存使用范围。例如,在第一次运行中,堆内存消耗为75千字节,然后在下一轮中降至35千字节。如果我执行它几次,那么这个值会随机波动。
这是正常还是我在这里遗漏了什么?我已经绘制了数据大小与内存消耗的关系图,并且随着这种波动,我将无法绘制图表。
java版“1.8.0_65”
答案 0 :(得分:0)
这是Java的garbage collector
在工作,它按照自己的节奏开始并完成它的工作。也许,最好在显式调用System.gc()
之后测量使用的内存量,这样你就不会记录垃圾了。
编辑:
在执行测试之后应该调用System.gc()
,以明确请求垃圾收集器启动。虽然System.gc()
仅作为请求被处理,但数学上并非100%确定JVM将尊重您的要求,您的分析最有可能是安全的,特别是如果您执行多次运行。
关于测量内存使用情况,这非常棘手,特别是对于低值。请参阅this answer,其中包含一些不错的详细信息:
答案 1 :(得分:0)
您可能会发现JMH对于运行基准测试非常有用,同时隔离了JVM的副作用。
通读the code samples了解如何使用它。