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

标签 java performance memory-leaks

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

Java 标准库中的任何集合都会发生同样的情况。甚至还有一些违反直觉的事实,例如 HashSetHashMap 更需要内存,因为 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/

相关文章:

java - 关闭后删除由外部应用程序打开的文件

C# Entity Framework 内存使用率高,内存泄漏?

java - 在java 8中迭代List并在迭代时调用另一个函数

java - 设计来管理应用程序中服务的付费订阅?

python - 用整数和单词对字符串进行排序,而不改变它们的位置

java - 为返回数组的方法减少 Java 垃圾收集?

r - 使用R中的igraph计算开放三角形顶点中节点的出现次数

C - sbrk(size) 返回有效指针,但 sbrk(0) 为负值

javascript - IE、OF、Google Chrome 中的内存泄漏递归 javascript 函数

java - 即使我将 boolean 值设置为自动为假,如果语句也不起作用