java内存管理的8个小技巧

1.         尽量使用直接量

这个大家应该清楚,所以只做简诉:
String str = "hello";
上面这种方式会创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;
String str = new String("hello");
此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o

2.         使用StringBuilder和StringBuffer进行字符串连接

这个我就不多讲了,用String做连接时会生成大量临时字符串

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

大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null

         例如:

         Public void test(){

                   Object obj = new Object();

                   ……

                   Obj=null;

}

上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:

Public void test(){

                   Object obj = new Object();

                   ……

                   Obj=null;

                   //执行耗时,耗内存操作;或调用耗时,耗内存的方法

                   ……

}

这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。

4.         尽量少用静态变量

当某个对象被static变量所引用,那么GC通常是不会回收这个对象所占的内存。如下:

Class Person{

         static Object obj = new Object();

}

对于上面的对象而言,obj变量的生命周期与Person类同步,在其不被卸载的情况下,其对应的Class对象会常驻内存,知道程序结束。

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

6.         缓存经常使用的对象

这里首先说一个实现缓存时常有的两种方式:

使用HashMap进行缓存

直接使用某些开源的缓存项目

如果是第一种,程序员需要手动控制HashMap容器里key-value对不至于太多,从而导致其占用过大的内存,致使系统性能下降。

而第二种多使用一些缓存算法,提高系统运行效率,例如OSCache,Ehcache等,它们大都实现了FIFO\MRU等常见的缓存算法。

7.         尽量不要使用finalize方法

实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。

8.         考虑使用SoftReference

当程序需要创建长度很大的数组时,可以考虑使用SoftReference来包装数组元素

SoftReference是个很好的选择,当内存足够时,它的功能等同于普通引用,当内存不足时,它会牺牲自己,释放软引用所引用的对象。例如创建一个长度为100000Person数组。

注意:在使用软引用来引用对象时不要忘记软引用的不确定性,程序通过软引用所获取的对象有可能为null(内存紧张时)。所以当应用程序取出SoftReference所引用的java对象之后,应该显式判断该对象死后为null,为null时,应该重建对象。

总结:这只是在学习过程中的一些笔记,希望大家多沟通,共同进步

posted on 2011-07-19 12:27 朝阳zzz 阅读(349) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

最新评论

阅读排行榜

评论排行榜