1、合理的使用设计模式
单利模式:控制内存中只存在一个对象可以减少内存、减轻加载负担和时间,提升加载效率。
享元模式:减少对象创建的数量来达到减少内存
2、避免过多创建Java对象,可以采用享元模式来减少对象的创建,可以用基本数据类型代替包装类型的对象。
3、尽可能使用final修饰符,在Java中final关键字修饰后不会直接定义内联函数。而是告诉编译器可以将其修饰的函数看作内联函数,编译器会比较效率后决定是否视其为内联函数。如果是内嵌调用,虚拟机不再执行正常的方法调用(参数压栈,跳转到方法处执行,再调回,处理栈参数,处理返回值),而是直接将方法展开,以方法体重的实际代码替代原来的方法调用。
https://blog.csdn.net/smartbetter/article/details/80561284
4、尽可能使用局部变量,传递的参数和临时变量都保存在栈中,静态变量和实例变量等都存在堆中,栈相比于堆查询的效率高、空间小、产生的碎片小,栈自动释放而堆需要GC。
5、尽量使用基本数据类型代替对象,尽可能使用基本类型代替包装类型。
基本类型跟包装类型、对象产生的内存区域是不同的,基本类型数据产生和处理都在栈中,包装类型属于对象,在堆中产生实例。
String str = "hello"; 上面这种方式会创建一个"hello"字符串,而且JVM的字符缓存池还会缓存这个字符串;
String str = new String("hello"); 此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o。
6、尽量不要将资源清理放在finalize方法中,由于GC的工作量很大,回收Young代内存时会引起应用程序暂停,使用finalize方法进行资源清理,会增加GC负担,程序运行效率更差。
尽量在finally块中释放资源,避免资源泄漏。
7、这块有问题请见评论:
尽可能减少使用synchronize,同步对系统开销大甚至形成死锁,尽可能避免无谓的同步控制,synchronize的方法尽可能小,因为被锁住的方法执行完,其余线程无法调用当前对象的其余方法。
单线程应尽量使用HashMap、ArrayList,因为HashTable、Vector等使用了同步机制,下降了性能。
尽量合理的创建HashMap,建立较大hashMap时,避免多次扩容,减少进行hash重构的次数,准确估计大小,利用public HashMap(int initialCapacity, float loadFactor)构造函数来设置初始容量和加载因子。
8、这块有问题请见评论:
合理选择String、StringBuilder 、StringBuffer。
StringBuffer:线程安全(内部大量使用synchronized机制)但效率低,提前估算容量避免重建提高效率StringBuffer buffer = new StringBuffer(1000);
StringBuilder:线程不安全、效率块。
String:不可变。String的引用在栈、String的值是一个字符数组,字符数组的值存放在常量池中。(字面常量存在常量池)
- String str = "ABC"; str 在栈,"ABC"在常量池中。
- String str = new String("ABC"); str的value存在堆中(为字符数组的引用),字符数组存在常量池中。
9、减少对变量的重复计算:for(int i=0;i<list.size();i++)
改为 for(int i=0,len=list.size();i<len;i++)
System.arraycopy() 循环复制数组
10、没必要的建立,比如:判断条件满足时再new 相关对象等。
11、对象释放前置:局部变量在方法结束后会变成垃圾,比如:方法1中没必要obj设为null,方法2中可以提前将不用的Obj设为null。
1.
Public void test(){
Object obj = new Object();
……
Obj=null;
}
2.
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时,耗内存操做;或调用耗时,耗内存的方法
……
}
12、位运算符代替乘法、除法操作更高效。nt num = a * 2; int num = a / 2;
改为int num = a << 2; int num = a >> 2;
13、合理的选用容器
网友评论