天天看点

《JVM垃圾回收相关内容》开发中,如何尽量减少GC开销,减轻垃圾回收的负担

前言:这段时间回顾了一下GC的相关知识,理论可以指导实践,学习的目的就是为了使用。所以,在平时的开发中,如何写代码,可以减少

GC开销,是我一直思考的问题,带着这个问题,我找到了网上的这些内容,总结的不错,我认为很好。美中不足的是,理论说的好,但是如何

实操,没有做进一步的引导。我稍加修改,加上自己的理解,从实操性上进行了增减,以飨读者。水平有限,如有不足之处,请见谅。

    第一点:不要显式调用System.gc()方法。调用System.gc()虽然不一定会触发Major GC,但还是有可能触发的。一旦触发Major GC,就会造成

程序执行中断,影响系统性能。

    第二点:尽量减少临时对象的使用。临时对象在方法执行完以后,就会成为垃圾。少用临时对象就相当于减少了垃圾的产生。

    第三点:对象不用时最好显式置为null。一般而言,为null的对象都会被作为垃圾处理,所以将不用的对象显式地设为null,有利于GC收集器

判定垃圾,提高GC效率。在实际开发中,我们应该怎么做呢?例如我们创建了一个List对象,当List使用完以后,我们可以List = null

    第四点:进行字符串拼接操作时,尽量使用StringBuffer代替String。String是不可变类,生成的对象是固定长度的。拼接String时,会创建

多个String对象。而这些对象,在方法执行完以后,都成为了垃圾。使用StringBuffer时,只会创建一个StringBuffer对象和一个字符数组。所以

在进行多字符串的拼接时,最好使用StringBuffer。

    第五点:尽量使用基本类型如int,long,而不使用他们的包装类Integer,Long。基本类型变量占用的内存资源比包装类对象少得多。有兴趣

的朋友,可以思考一个问题:int变量占用的内存空间是多大?Integer对象占用的内容空间是多大?(这里会用到java对象的内存结构的相关知识

,对象如何分配内存,每个部分分配多大内存)在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

    第六点:尽量减少static对象和static变量。static静态变量属于全局变量,不会被GC回收。

    第七点:分散对象创建或删除的时间。集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只

能进行Major GC,以回收内存或整合内存碎片。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大

增加了下一次创建新对象时强制Major GC的机会。(Major GC,发生在永久代的GC)