构建内存高效 Java 应用程序的最佳实践有哪些?

Jad*_*mas 3 java performance memory-leaks

Java 程序可能非常消耗内存。例如,一个Double对象有 24 个字节:8 个字节的数据和 16 个字节的 JVM 施加的开销。一般来说,表示原始类型的对象非常昂贵。

Java 标准库中的任何集合都会发生同样的情况。甚至还有一些违反直觉的事实,例如 aHashSet比 a 更需要内存HashMap,因为 aHashSet包含HashMap内部 ( http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html )。

在高性能设置中对数据进行建模和对象委派时,您能否提出一些建议,以便减轻 Java 的这些“弱点”?

Mar*_*mus 5

我用来减少内存的一些技术:

  • 创建您自己的 IntArrayList (等)类来防止装箱
  • 创建您自己的 IntHashMap (等)类,其中键是基元
  • 使用 nio 的 ByteBuffer 可以高效地存储大型数据数组(并且在本机内存中、堆外)。它类似于字节数组,但包含以任意偏移量从缓冲区存储/检索所有原始类型的方法(以内存换取速度)
  • 不要使用池化,因为池会显式地保持未使用的实例处于活动状态。
  • 很少使用线程,它们非常消耗内存(在本机内存中,在堆外)
  • 当创建大字符串的子字符串并丢弃原始字符串时,子字符串仍然引用原始字符串。所以用来new String处理旧的大绳子。
  • 线性数组比多维数组小,如果除最后一个维度之外的所有维度的大小都是 2 的幂,则计算索引最快:array[x|y<<4]对于 16xN 数组。
  • 初始化集合并StringBuilder选择初始容量,以防止在典型情况下进行内部重新分配。
    • 使用StringBuilder而不是字符串连接,因为编译后的类文件使用new StringBuilder()没有初始能力来连接字符串。