代码优化,任重而道远!
代码细节的优化,如溪流聚成大海。
一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。
例如:
优化代码可能仅让单次请求效率提升1毫秒,但每天的请求是100万次,那么就是100万毫秒的效率提升!
1、尽量使用局部变量
局部的常量参数变量和对象引用都保存在栈中。栈区的数据在超过作用域后,会自动释放掉,不需要交给GC垃圾回收器处理。
2、尽量重用对象
特别是String对象,如需拼接字符串:
因为虚拟机不仅要花时间生成对象,以后还需要花时间对这些对象进行垃圾回收,因此生成过多的对象将会给程序的性能带来较大的影响。
3、尽量减少对变量的重复计算
第一个例子每次循环,都要运行一次list.size()方法获取集合的记录数,如果list集合数据量很多的话,那么是严重影响运行效率的。改成用第二个例子,则可以减少很多的消耗。
4、及时关闭流
Java开发过程中,少不了要操作数据库、IO读写。进行这些操作时务必要谨慎,在使用完毕后,需要及时关闭以及释放资源。因为这些大对象操作会对系统造成很大的开销,稍有不慎后果严重。
5、不要在循环中使用 try catch
在循环中使用try catch 会导致出现异常后依然继续执行循环的情况出现!
6、慎用异常
抛出异常首先是要创建对象的,Throwable接口的构造函数调用名为fillInStackTrace()的本地同步方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建 了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。
7、循环内尽可能不要创建对象
创建对象是需要开辟内存空间的,如果需要遍历的集合数据量很大,就会很消耗内存了。
第二个例子,内存中只有一个Object对象的引用,指向的是同一个内存地址。只是每次new Object()的时候,Object对象引用指向不同的Object,但是内存中只有一份,这样就打打节省内存空间了。
8、循环内尽可能不要查询数据库
查询数据库、连接数据库都是需要占用时间,消耗资源,所以会严重影响数据库的性能。
解决方案推荐是尽可能可以一次性把所需要的结果查询出来(联表、where in)。
9、使用带缓冲的输入输出流进行IO操作
带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率。
10、使用最有效率的方式去遍历Map
只是想遍历一下这个Map的key值,那用”Set<String> keySet = hm.keySet();”会比较合适一些。
11、尽量避免使用静态变量
当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的
此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会常驻内存,直到程序终止
12、集合返回值优化
在工作中,经常会遇到,返回集合给前端,前端不接受集合会有null值的情况。通常我们都会新创建一个空的集合返回给前端。都知道,创建新对象都是需要开辟内存空间的。其实我们可以改成用Collections下面自带的emptyList()、emptySet()、emptyMap() 。
通过查看Collections的源码,我们可以发现List、Set、Map返回的是一个独立的全局对象,所以这样返回相对来说节省空间。
当然他们的返回值也是有一点坑的。
代码优化还有很多,后续再慢慢补上。有更好的建议,欢迎补充~