java垃圾回收是java编程开发语言学习过程中需要重点掌握的一个技术,而今天我们就一起来了解一下,java垃圾回收都需要注意哪些问题。
1、预测收集能力
所有的Java标准集合和大多数自定义的扩展实现(如Trove和谷歌的Guava),都会使用底层数组(无论基于原始或基于对象)。数据的长度一旦分配后,数组就不可变了,所以在许多情况下,为集合增加项目可能会导致老的底层数组被删除,然后需要重新分配一个更大的数组来替代。
大多数的集合实现都尝试在集合没有被设置为预期大小时,还能对重分配过程进行优化,并降低其开销。但是,好的结果还是在构造集合时就设置成预期大小。
2、直接用处理流
当处理大型或未知大小的文件时,这个想法则不适用了,因为当JVM无法分配文件大小的缓冲区时,则会出现OutOfMemoryErrors错误。
但是,即使数据大小看似能管理,当涉及到垃圾回收时,上述模式仍会造成大量开销,因为它在堆上分配了相当大的blob来容纳文件数据。
3、使用不可变对象
不变性有诸多优势,但有一个优势却极少被重视,那就是不变性对垃圾回收的影响。
不变性意味着在构造容器完成之前,由不可变容器引用的所有对象都已经创建。在GC看来:容器会和其新的新生代保持一致。这意味着当对新生代(younggenerations)执行垃圾回收周期时,GC可以跳过老年代(oldergenerations)中的不可变对象,因为它知道不可变对象不能引用新生代的任何内容。
4、慎用字符串连接
字符串可能是任何基于JVM的应用中普遍的非原始数据结构。但是,其隐含重量和使用便利性使得它们成为应用内存变大的罪魁祸。
字符串是不可变的,所以在其连接时并没有被修改,而是依次分配新的字符串。此外,编译器利用标准StringBuilder类来执行的这些链接。这就导致了双重麻烦,在每次循环迭代时,我们得到(1)隐式分配临时字符串,(2)隐式分配临时的StringBuilder对象来帮助我们构建终结果。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。