总览
使用直接内存不能保证提高性能。 考虑到它增加了复杂性,除非有充分的理由使用它,否则应避免使用它。
塞尔吉奥·奥利维拉(Sergio Oliveira Jr)的这篇出色文章表明,这不仅仅是使用直接内存来提高性能的问题, 哪个更快:Java堆还是本机内存?
当您有大量数据和/或必须对这些数据执行一些IO时,直接内存和内存映射文件可以提供帮助。
时间序列数据。
时间序列数据往往具有大量条目,并且需要IO来加载和存储数据。 这使其成为内存映射文件和直接内存的理想选择。
我在这里提供了一个例子。 main和测试 ,对常规对象和内存映射文件执行相同的操作。 注意:我不建议访问对象的速度很慢,但是使用对象的开销是个问题。 例如,加载,创建,对象标题的大小,垃圾回收和保存对象。
该测试将时间和时间两列(买入价和卖价(以int值标准化))加载到时间序列数据中,该数据用于计算和保存简单的中间价格基点移动。 该测试执行一个GC,以包括管理所涉及对象的开销。
存储 | 百万 | 千万 | 3000万 | 1亿 | 2.5亿 |
---|---|---|---|---|---|
对象 | 0.55秒 | 4.4秒 | 16.7秒 | 86.7秒 | 225秒 |
地图 | 0.056秒 | 0.46秒 | 1.3秒 | 4.5秒 | 11秒 |
完整结果
对于较小的数据集,内存映射数据不仅速度快10倍,对于较大的数据量,它的伸缩性也更好,因为
- 内存映射的数据一旦映射到内存中就可以使用
- 它仅创建少量对象,几乎没有堆脚印,从而减少了GC时间。
- 您可以根据需要将其安排在内存中,因为每行没有对象,因此可以减少每行的开销。
- 不必额外做任何事情来保存数据。
使用直接内存和内存映射文件并不像使用Java对象那样简单,但是如果您有大量数据需求,则可能会有很大的不同。
我已经在之前的文章中讨论过,对于低延迟要求,使用直接内存和内存映射文件也可以有很大的不同。
参考: 使用 Vanilla Java博客的JCG合作伙伴 Peter Lawrey 可以更快地使用直接内存 。
翻译自: https://www.javacodegeeks.com/2012/11/when-using-direct-memory-can-be-faster.html