Java 程序可能非常耗费内存。例如,Double
对象有 24 个字节:8 个字节的数据和 16 个字节的 JVM 强加开销。通常,表示原始类型的对象非常昂贵。
Java 标准库中的任何集合都会发生同样的情况。甚至还有一些违反直觉的事实,例如 HashSet
比 HashMap
更需要内存,因为 HashSet
包含一个 HashMap
里面(http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html)。
在高性能设置中建模数据和对象委托(delegate)时,您能否提出一些建议,以减轻 Java 的这些“弱点”?
最佳答案
我用来减少内存的一些技巧:
- 制作您自己的防止装箱的 IntArrayList(等)类
- 制作您自己的 IntHashMap(等)类,其中键是原语
- 使用 nio 的 ByteBuffer 有效地存储大量数据(在 native 内存中,堆外)。它类似于字节数组,但包含以任意偏移量从缓冲区存储/检索所有原始类型的方法(以内存换取速度)
- 不要使用池,因为池会明确保留未使用的实例。
- 很少使用线程,它们非常耗费内存(在 native 内存中,堆外)
- 当对大字符串做子串,并丢弃原串时,子串仍然引用原串。所以使用
new String
处理旧的大字符串。 - 线性数组比多维数组小,如果除最后一个维度之外的所有维度的大小都是 2 的幂,则计算索引最快:
array[x|y<<4]
对于 16xN 阵列。 - 初始化集合和
StringBuilder
选择初始容量以防止在典型情况下进行内部重新分配。- 使用
StringBuilder
而不是字符串连接,因为编译的类文件使用new StringBuilder()
没有连接字符串的初始能力。
- 使用
关于java - 构建内存高效的 Java 应用程序有哪些最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28615939/