Java笔记3.3--代码级别优化内存性能

Java代码出现内存泄漏:

1.对象上有强引用

2.虽然Java程序运行完后内存会回收,但是越早越好

3.出现内存泄漏后,会导致Stop The World(一段时间内虚拟机什么也不做,单纯内存回收)和OOM异常

深入了解finalize方法:

1.object类的方法,任何类都可以重写

2.当JVM通过根可达算法,判断某对象可以被回收后,会判断是否重写了fialize方法,如果没有,直接回收

3.如果重写了,把该对象放入F-Queue队列,有线程专门遍历并执行该类的finalize方法

4.执行后,在判断该类是否可被回收,如果是就回收

注意:可以在finalize方法里编写类回收前所需的动作。如果编写不当,会造成对象无法回收,引发内存泄漏。没有特殊原因别重写。

public class FinalizeDemo {
	static FinalizeDemo obj = null;  
    //重写Object里的finalize方法  
    protected void finalize() throws Throwable {  
        System.out.println("In finalize()");  
        obj = this; //给obj加个强引用  
    }  
	
    public static void main(String[] args) throws InterruptedException {  
        obj = new FinalizeDemo();  
        obj = null; //去掉强引用  
        System.gc(); //垃圾回收
        //sleep 1秒,以便垃圾回收线程清理obj对象 
        Thread.sleep(1000);
        if (null != obj) { //在finalize方法复活  
            System.out.println("Still alive.");  
        } else {  
            System.out.println("Not alive.");  
        } 
    }  
}
输出:
In finalize()
Still alive.

在代码里优化JVM内存措施:

1.没有特殊原因,不重写finalize方法

2.别频繁操作String,尤其在循环和多线程。String是不可变类,频繁操作产生碎片。

3.频繁操作可用StringBuilder和StringBuffer。

4.在finally从句中释放IO,数据库,网络连接等的物理对象,确保对象在各种场景正确的关闭。

5.用好集合对象(List,HashMap等)后,及时clear。

6.大的对象用好后,在finally中设置为null,比如obj = null;

7.合理使用软引用弱引用

8.根本原理就是,尽早地清空对象上的强引用,或者尽可能少在对象上加强引用,从而让对象被回收的时间提前

9.合理调整JVM参数,如:java -Xms 500m -Xmx( 500m SyncupData(调整参数要慎重,优先考虑代码级别的优化措施)

猜你喜欢

转载自blog.csdn.net/lfanchenyu/article/details/107672314