java内存管理小技巧

来源:互联网 发布:linux创建用户和密码 编辑:程序博客网 时间:2024/05/18 00:15
  • 尽量使用直接量
    当需要使用字符串,还有Byte,Short,Integer,Long,Float,Double,Boolean,Character包装类的实例时,程序不应该采用new的方式来创建对象,而应该直接采用直接量来创建它们。
  • 使用StringBuilder和StringBuffer进行字符串连接
    String,StringBuilder,StringBuffer都可以代表字符串,其中String代表字符序列不可变的字符串,而StringBuilder和StringBuffer都代表字符序列可变的字符串
    如果程序使用多个String对象进行字符串连接运算,在运行时将生产大量的临时字符串,这些字符串会保存在内存中从而到时程序性能下降。
  • 尽早释放无用对象的引用
    大部分时候,方法的局部引用变量所引用对象会随着方法的结束而变成垃圾,因为局部变量的生存期限很短,当方法运行结束时,该方法内的局部变量就结束了生存期限。因此大部分时候程序无须将局部引用变量显示设为null.
public void info(){    Object object=new Object();    System.out.println(object.toString());    System.out.println(object.hashCode());    object=null;}

public void info(){
Object object=new Object();
System.out.println(object.toString());
System.out.println(object.hashCode());
object=null;
//执行耗时,耗内存操作
//或者调用耗时,耗内存的方法
}

上面因为需要执行耗内存耗时的方法,可以尽早的释放对Object对象的引用。所以可能的是程序在执行耗时,耗内存操作时,obj之前所引用的Object对象可能被垃圾回收了。

  • 尽量少用静态变量
    从理论上来说,Java对象何时被回收由垃圾回收机制决定,对程序员来说是不确定的。由于垃圾回收机制判断一个对象是否是垃圾的唯一标准是该对象是否有引用变量引用它,因此推荐尽早释放对象的引用。
    最好的情况是,某个对象被static变量所引用,那么垃圾回收机制通常是不会回收这个对象所占的内存的。如下代码:

class Person{
static Obejct obj=new Object();
}

Obj变量是Person类的静态变量,因此它的生命周期与Person类同步。在Person类不被卸载的情况下,Person类对应的Class对象会常驻内存,直到程序运行结束。因此,obj所引用的Object对象一旦被创建,也会常驻内存,知道程序结束。

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

经常调用的方法和循环有一个共同特征:这些代码段会被多次重复调用。如下:

for(int i=0;i<10;i++){
Object obj=new Object();
}
虽然上面的obj是局部变量,执行完之后会失效,当时要循环创建10次,系统要不断地分配空间,执行初始化操作。这些对象的生存时间又不长,所以系统又要回收它们所占的内存空间,在这些操作中会消耗不少性能。

  • 缓存经常使用的对象

如果有些对象需要被经常使用,则可以考虑把这些对象用缓存池保存起来,,这样当下次需要时就可直接拿出这些对象来用,典型的缓存就是数据连接池,数据连接池缓存了大量的数据库连接,每次需要访问数据库是都可以直接去除数据库连接。

除此之外,系统的一些常用基础信息也可以通过缓存的方式存起来。实现缓存一般有两种方式:

1.使用HashMap进行缓存(不宜存储过多数据,从而内存过大,导致性能下降)
2.直接使用某些开源项目进行缓存

  • 尽量不要使用finalize()方法

当一个对象失去引用之后,垃圾回收器准备回收该对象之前,垃圾回收机制会先调用改对象的finalize()方法来执行资源清理。处于这种考虑,可能有些开发者会考虑使用finalize()方法来进行资源清理。

实际上,将资源清理放在finalize()方法中完成是非常拙劣的选择。根据前面介绍的垃圾回收算法,垃圾回收机制工作量已经够大了,尤其是回收Young代内存时, 大都会引起应用程序暂停,使得用户难以忍受。

在垃圾回收器本身已经严重制约应用程序性能的情况下,如果再选择使用finalize()方法进行资源清理,无疑是一种火上浇油的行为,这将导致垃圾回收器的负担更大,导致程序运行效率更差。

  • 考虑使用SoftReference

当程序需要创建长度很大的数组时,可以考虑使用SoftReference来包装数组元素,而不是直接让数组元素来引用对象。

SoftReference是一个很好的选择,当内存充足时不回收数据,当内存不充足时释放软引用所引用的对象。

作者:Jack921
链接:http://www.jianshu.com/p/b6e7ba99593d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原创粉丝点击