[jvm内存管理小技巧][java内存管理小技巧]

已有 516 次阅读2015-9-21 16:34 |个人分类:技术分享| java内存

记录读书笔记,为了提高java程序的运行性能,我们要掌握java内存管理的几个小技巧,下面把这几条小技巧笔记记录一下。
1、尽量使用直接量
当需要使用字符串,还有Byte、Short、Integer、Long、Float、Double、Boolean、Character包装类的实例时,程序不应该采用new的方式来创建对象,而应该直接采用直接量来创建他们。
例如,程序需要“www.cfei.net”字符串,应该采用如下代码:
String str="www.cfei.net";
上面方式创建一个“www.cfei.net”字符串,而且JVM的字符串缓存池还会缓存这个字符串。但如果程序出现如下代码
String str=new String("www.cfei.net");
此时程序同样创建了一个缓存在字符串缓存池中的"www.cfei.net"字符串,除此之外,str所引用String对象底层还包含一个char[]数组,这个char[]数组里依次存放了 w、w、w、.、c、f、e、i、.、n、e、t等字符。
2、使用StringBuilder 和 StringBuffer 进行字符串连接
String、StringBuilder、StringBuffer都可以代表字符串,其中String代表字符串序列不可变的字符串,而StringBuilder和StringBuffer都代表字符序列可变的字符串。
如果程序使用多个String对象进行字符串连接运算,在运行时将产生大量的临时字符串,这些字符串会保存在内存中从而导致程序性能下降。
3、尽早释放无用对象的引用
大部分时候,方法的局部引用变量所引用的对象会随着方法的结束而变成垃圾,因为局部变量的生存期限很短,当方法运行结束时,该方法内的局部变量就结束了生存期限,因此,大部分时候程序无需将局部引用变量显示设为null。
例如下面的这个方法:
帮助
1
2
3
4
5
6
7
8
9
public void getCfei(){
 
Object obj = new Object();
 
System.out.println(obj.toString());
 
obj=null;
 
}
如上obj=null其实是没有必要的,随着方法的执行结束,程序中obj的引用变量的作用域就结束了,原来obj所引用的对象就会变成垃圾。
但如果在obj=null之后还有需要执行耗时、耗内存的操作,那么obj=null是有必要的。
 
4、尽量少用静态变量
从理论上来说,java对象何时被回收由垃圾回收机制决定,对程序猿来说是不确定的。
由于垃圾回收机制判断一个对象是否是垃圾的唯一标准是改对象是否还有引用变量引用它,因此尽早去释放对象的引用是有道理的。
最坏的情况是,某个对像被static变量所引用,那么垃圾回收机制通常是不会回收这个对象所占的内存的。例如:
帮助
1
2
3
4
5
class Dog{
 
static Object littleDog = new Object();
 
}
对于上面的Object对象而言,只要littleDog变量还引用他,它就不会被垃圾回收机制回收。
littleDog变量是Dog类的静态变量,因此他的生命周期与Dog类同步。在Dog类不被卸载的情况下,Dog类对应的Class对象会常驻内存,直到程序运行结束。因此,littleDog所引用的Object对象一旦被创建,也会常驻内存,直到程序运行结束。
jvm会将程序中Dog类的信息存入Permanent代(永久代),也就是说Dog类、littleDog引用变量都将存在Permanent代中,直到程序运行结束
===============  待续  ===============
5、避免在经常调用的方法、循环中创建java对象
6、缓存经常使用的对象
7、尽量不要使用finalize方法
8、考虑使用SoftReference

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

返回顶部