构建内存效率高的Java应用程序的最佳实践是什么?
Java程序可能非常需要内存。例如,一个构建内存效率高的Java应用程序的最佳实践是什么?,java,performance,memory-leaks,Java,Performance,Memory Leaks,Java程序可能非常需要内存。例如,一个Double对象有24个字节:8个字节的数据和16个字节的JVM开销。通常,表示基元类型的对象非常昂贵 Java标准库中的任何集合也是如此。甚至还有一些违反直觉的事实,例如HashSet比HashMap更需要内存,因为HashSet内部包含HashMap) 在高性能设置中对数据建模和对象委派时,您能否提出一些建议,以减轻Java的这些“弱点”?如果您有高性能限制,并且需要将集合用于简单类型,您可以查看一些Java基元集合的实现 其中包括: 另外,
Double
对象有24个字节:8个字节的数据和16个字节的JVM开销。通常,表示基元类型的对象非常昂贵
Java标准库中的任何集合也是如此。甚至还有一些违反直觉的事实,例如HashSet
比HashMap
更需要内存,因为HashSet
内部包含HashMap
)
在高性能设置中对数据建模和对象委派时,您能否提出一些建议,以减轻Java的这些“弱点”?如果您有高性能限制,并且需要将集合用于简单类型,您可以查看一些Java基元集合的实现 其中包括:
另外,请参考以下问题:注意早期优化。 看
虽然不知道应用程序或运行时环境的确切要求,但根据我的经验,java能够处理我抛出它的任何东西。如果性能或垃圾收集(您标记为内存泄漏)是一个问题,那么在演示/概念验证应用程序上进行一些评测可能是一个不错的选择。取决于应用程序,但一般来说
- 在(并行)基元数组中布局数据结构
- 尝试制作大的“平面”对象,内联其他合理的子结构
- 专门化原语集合
- 重用对象、使用对象池、线程局部变量
- 滚蛋
最后,它与你的问题没有严格的关系,但它是紧密相连的。如果您想将Java对象序列化为最佳的二进制表示形式,我建议您使用Java中的Google Protocol Buffers。协议缓冲区是传输数据结构的理想选择,因为网络使用尽可能少的带宽,并且编码/解码速度非常快。您可以做很多事情 以下是一些问题和解决方案:
- 当使用字符串指定对象的“状态”或其他只能具有一组特定可能值的内容时,不要使用字符串。而是使用枚举。如果您不知道枚举是什么或如何使用枚举
- 如果您使用字符串作为变量,而该变量的值在程序中的某个点会发生变化,请不要像通常那样定义字符串。相反,使用java.lang包中的StringBuilder类。StringBuilder是一个用于创建字符串并更改其值的类。此类处理字符串的方式与通常的不同。当它用于更改字符串的值时,StringBuilder不会创建具有不同值的重复字符串来替换旧字符串,而是实际更改原始字符串的值。因此,由于您没有创建重复的字符串,因此可以节省RAM李>
- 所有读写器对象都有一个名为close()的方法。正如您可能猜到的,它关闭writer或reader对象。它所做的只是去掉reader或writer对象。当你有读者或作家的时候
Integer stack[]; stack = new Integer[10]; int stackPtr = 0; // a few push operation on our stack. stack[stackPtr++] = new Integer(5); stack[stackPtr++] = new Integer(3); // and pop from the stack again --stackPtr; --stackPtr; // at this point, the stack is logically empty, but // the Integer objects are still referenced by the array, // and are basically leaked.
stack[--stackPtr] = null;