内存管理的小技巧

来源:互联网 发布:vb left函数的使用方法 编辑:程序博客网 时间:2024/05/15 11:57

        我们知道掌握Java的内存回收、垃圾回收机制是为了更好地管理Java虚拟机的内存,这样才能提高程序的运行性能。下面给出几个内存管理的小技巧。

1、尽量使用直接量

        当需要使用字符串,还有Byte,Short、integer、Long、Float、Double、Boolean、Character包装类的实例时,不应该采用new的方式来创建对象,而应该使用直接量来创建它们。

2、使用StringBuilder和StringBuffer进行字符创的连接

        String、StringBuilder和StringBuffer都可以代表字符串,其中String代表字符序列不可变的字符串,而StringBuilder和StringBuffer都可代表字符序列可变的字符串。如果使用多个String对象进行字符串连接操作,在运行时将生成大量的临时字符串,这些字符串会保存在内存的静态常量池中,可能再也不会用到,从而消耗内存导致性能下降。

3、尽早释放无用对象的引用

        大部分时候,方法的局部变量、引用变量所引用的对象的生命周期很短,随着方法的结束而变成垃圾,因此大部分时候无需将局部变量、引用变量显式设为null。
但是倘若遇到下列情况,就要显式设为null了。请看下面的代码:
       
public void info(){            Object obj = new Object();            System.out.println(obj.toString);    System.out.println(obj.hashCode());            obj=null;             //下面是耗时耗内存的代码                  ... ...            }

4、尽量少用静态变量

        理论上来说,Java对象何时被回收由垃圾回收机制决定,对程序员来说是不确定的。由于垃圾回收机制判断一个对象是否是垃圾的唯一标准就是该对象是否有引用变量引用它,因此推荐尽早释放对象的引用。最坏的情况是某个对象被static变量所引用,那么垃圾回收机制通常是不会回收这个对象所占的内存。因为static变量是类变量,属于某个类,在这个类没有被卸载的情况下,该类对象就会常驻内存。

5、避免在经常调用的方法、循环中创建Java对象

        请看下面的代码:
         for(int i = 0;i < 10;i++){
             Object obj = new Object();
        }
       上面循环创建了十个Object对象,虽然上面的变量都是局部变量,循环结束时这些局部变量都会失效,但由于这段循环导致Object对象被创建十次,因此系统需要不断的为这10个对象分配内存空间,执行初始化操作。由于这10个对象生命周期很短,接下来系统又要回收它们所占内存,这种不断的分配、回收操作中,系统性能受到很大影响。

6、缓存经常使用的对象

        当有些对象需要经常被使用,可以考虑把这些对象用缓冲池保存起来,当下次使用时就可以直接拿出来使用了。典型的缓存就是数据连接池,数据连接里缓存了大量的数据库连接,每次程序需要访问数据库时都可以直接取出数据库连接。
实现缓存通常由两种方式:使用HashMap进行行缓存;直接使用某些开源项目。
        注:缓存的设计本身是一种牺牲系统空间来换取运行时间的技术,不管是哪类缓存实现,都会使用容器来保存已用过的对象。对容器的容量控制是缓存设计的关键。

7、尽量不要使用finalize()方法

        当一个对象失去引用之后,垃圾回收机制准备回收该对象之前,会先调用该对象的finalize()方法执行资源清理。由于垃圾回收机制的的工作量已经够大了,尤其是回收Young代内存,大都会引起程序暂停,如果再使用finalize()方法,会导致垃圾回收机制的负担更大,导致程序运行效率更差。

8、考虑使用SoftReference对象

        当需要创建长度很大的数组时,可以考虑使用SoftReference来包装数组元素。(SoftReference是软引用:当内存足够时,它的功能等同于强引用,当内存不足时它会牺牲自己,释放所引用的对象。由于软引用的不确定性,有可能多获取的对象是null,从而引起空指针异常。)
原创粉丝点击