如何在Java中创建内存有效的数据结构

时间:2017-05-23 05:25:33

标签: java memory data-structures

如果我理解正确,Java会为每个类创建一些开销。如果我想创建典型的数据结构,例如链表,树,尝试等,那么单个(列表)项将是类,因此与C中的类似数据结构相比会产生显着的开销。这对于非常大的特别困难数据集。有没有更好的方法在Java中实现这些类型的数据结构,这样我就不会有在内存中存储类的开销?

这里描述了memory consumption Java对象。如果我有数百万个对象,使用对象的开销可能会变得太昂贵。所以我想知道是否有更好的方法来处理这种情况。

4 个答案:

答案 0 :(得分:1)

您可以在字节块上实现这些集合(获取为new byte[...]ByteBufferallocate[Direct](...)unsafeallocateMemory(...))。然后,您可以手动管理此内存:将对象打包/解包到字节块以及其他数据(如二叉树的leftright索引,索引为next对于链表等。)这样你就不必在对象头,额外引用,对齐上花费内存(尽管你可能决定需要引入自己的对齐);可以让你的物品脱离;可以将它们映射到文件系统以实现持久性等。但是,它并不简单并且会产生细微之处(例如,您可能会开始依赖malloc实现并丢失JVM堆优化;丢失内存模型保证;您的对象可能会丢失在缓存行之间拆分;您将失去GC压缩等的好处。)。我并不是说这些中的任何一个都是一个显示阻止者,只是因为它不是所有的玫瑰,你应该明白你到底获得了什么。如果您有数百万个对象,那么开销可能是100兆字节。确保尝试保存它们是值得的(与需要多少数据相比+与堆的大小相比)。

答案 1 :(得分:0)

你总是可以在Java(JNI)中使用c ++本机代码来提高性能和控制水平(我认为你真的不需要这个,我不确定你是否能超越标准java code)。

答案 2 :(得分:0)

快速搜索" c ++库jni"发现这篇题为Wrapping a C++ library with JNI – introduction的文章可能很有趣。我没看过,所以我不对内容做出推荐或保证。

答案 3 :(得分:0)

如果你有数据集,其中java的对象大小开销是一个实际问题,我建议考虑使用数据库。您可以从内存中嵌入式数据库开始,例如sqlite,h2或redis。

随着您的数据变得越来越大,您将需要更复杂的管理。手动更新交叉引用,索引等以确保可以有效查询数据是数据库可以提供帮助的巨大努力。

使用适当的数据库还可以让您在数据开始达到数百GB级别时不再适应内存,以及当您必须转换到实际开始使用磁盘时,甚至在您当你必须使用多台机器来保存数据时,达到数TB级别,而不会有重大的重写。

正确的数据库可以与您的应用程序一起增长,内存中的一堆对象不能。