最近在看内存优化方面的一些知识,虽然很多东西目前来说,多不能完全理解,但是在我看来,至少养成好的编码习惯是第一步:
1、尽可能少的创建对象。
for(...) {
A a = new A();
if (...) {
list.add(a);
}
}
改为:
for(...) {
if (...) {
A a = new A();
list.add(a);
}
}
2、如果一定要创建对象,尽量使用局部变量。
3、将成员缓存到本地;另一个相似的原则是:永远不要在for的第二个条件中调用任何方法。如下面方法所示,在每次循环的时候都会调用getCount()方法,这样做比你在一个int先把结果保存起来开销大很多;同样如果你要多次访问一个变量,也最好先为它建立一个本地变量;
for(int i =0; i <list.count; i++) {
}
改为:
int len = list.count
for(int i = 0; i < lent; i ++) {
}
4、使用final修饰变量。
5、尽量使用StringBuilder和StringBuffer进行字符串连接
6、单线程应尽量使用HashMap、ArrayList
7、 尽量避免频繁使用split,如果确实需 要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char)
8、避免过深的类层次结构和过深的方法调用。
9、变量只有在用到它的时候才定义和实例化。
10、 避免在循环体中声明创建对象,即使该对象占用内存空间不大。
for (int i = 0; i < 10000; ++i) {
Object obj = new Object();
System.out.println("obj= " + obj);
}
上面的做法会浪费较大的内存空间。正确的做法如下所示:
Object obj = null;
for (int i = 0; i < 10000; ++i) {
obj = new Object();
System.out.println("obj= "+ obj);
}
采用上面的第二种编写方式,仅在内存中保存一份对该对象的引用,而不像上面的第一种编写方式中代码会在内存中产生大量的对象引用,浪费大量的内存空间,而且增大了垃圾回收的负荷。因此在循环体中声明创建对象的编写方式应该尽量避免。
更多:Java内存优化