文档章节

Java代码性能优化总结

wlc534
 wlc534
发布于 2017/09/12 10:17
字数 2137
阅读 5
收藏 0

Java代码优化的目标是:1、减小代码的体积   2、提高代码运行的效率。
具体优化方法有下面几种:
1、及时关闭流
Java编程过程中,进行数据库连接、I/O流操作时务必小心,使用完毕后,及时关闭以释放资源,因为对这些大对象的操作会造成系统大的开销。
2、尽量减少对变量的重复计算
对方法的调用,即使方法中只有一句语句,也是有消耗的,例如:
for(int i=0;i<list.size();i++)建议替换为for(int i=0,int length=list.size();i<length;i++)
这样在list.size()很大的时候,就减少了不必要的消耗。
3、尽量采用懒加载的策略,即在需要的时候才创建
String aa="123";if(i==1){...} 
可以将变量定义放在if条件判断里面if(i==1){String aa="123";}这样可以提高程序运行效率。
4、慎用异常 
异常对性能不利,只要有异常被抛出,Java虚拟机就必须调用堆栈,因为在处理过程中创建了一个新的对象。
5、循环内不要不断创建对象引用
例如for(int i=1;i<=count;i++){Object obj = new Object();}
这种做法会导致内存中有count份Objct对象引用存在,count很大的话,就消耗内存了,建议修改为
Object obj = null;
for(int i=0;i<=count;i++){obj = new Object();}
这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object罢了,但是内存中只有一份,这样就大大节省了内存空间。
6、基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时使用ArrayList。
7、尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销。
8、单例要使用在恰当的场合
使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但不是所有地方都可以使用单例,概括来说,单例主要适用于以下三个方面:
(1) 控制资源的使用,通过线程同步来控制资源的并发访问。
(2) 控制实例的产生,以达到节约资源的目的。
(3) 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。
9、尽量避免随意使用静态变量
public class A {private static B b = new B();}
此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会常驻内存,直到程序终止。
10、及时清除不再使用的会话
许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多的会话时,如果内存不足,那么操作系统会把部分不活跃的会话数据转储到磁盘。如果会话要被转储到磁盘,那么必须先要被序列化,大规模集群中,对对象进行序列化的代价是很昂贵的。因此,当会话不再需要时,应当及时调用HttpSession的invalidate()方法清除会话。
11、使用同步代码块替代同步方法
除非能确定整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要进行同步的代码也进行了同步,影响了代码执行效率。
12、不要创建一些不使用的对象,不要导入一些不使用的类
这毫无意义,如果代码中出现"The value of the local variable i is not used"、"The import java.util is never used",那么请删除这些无用的内容。
13、使用数据库连接池和线程池
这两个池都是用于重用对象的,前者可以避免频繁地打开和关闭连接,后者可以避免频繁地创建和销毁线程
14、使用带缓冲的输入输出流进行IO操作
带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率。
15、顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList。
16、不要让public方法中有太多的形参
public方法即对外提供的方法,如果给这些方法太多形参的话主要有两点坏处:
(1)、违反了面向对象的编程思想,Java讲求一切都是对象,太多的形参,和面向对象的编程思想不契合。
(2)、参数太多势必导致方法调用的出错概率增加。
17、不要在循环中使用try...catch...,应该把其放在最外层。
18、程序运行过程中避免使用反射
反射是Java提供给用户一个很强大的功能,功能强大往往意味着效率不高。不建议在程序运行过程中使用尤其是频繁使用反射机制,特别是Method的invoke方法。
19、把一个基本数据类型转为字符串,data.toString()是最快的方式、String.valueOf(data)次之、data+""最慢
(1)、String.valueOf()方法底层调用了Integer.toString()方法,但是会在调用前做空判断
(2)、Integer.toString()直接调用
(3)、data+""底层使用了StringBuilder实现,先用append方法拼接,再用toString()方法获取字符串
显而易见,(2)最快、(1)次之、(3)最慢
20、尽量指定类、方法的final修饰符
带有final修饰符的类是不可派生的,为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行
效率作用重大。
21、尽量重用对象
特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。
22、乘法和除法
用移位操作替代乘除法操作可以极大地提高性能。
23、选择合适的引用机制
在JSP应用系统中,页头、页脚部分往往被抽取出来,然后根据需要引入。当前JSP页面中引入外部资源的方法主要有两种:include指令及include动作。
include指令:<%@ include file="copyright.html" %>,该指令在编译时引入指定的资源。在编译之前,带有include指令的页面和指定的资源被合并成一个文件。外部资源在引用时就确定,比运行时才确定更高效。
include动作:<jsp:include page="copyright.html" />,该动作引入指定页面执行后生成的结果。由于它在运行时完成,因此对输出结果的控制更加灵活。但是,只有当被引用的内容频繁地改变时,或者对主页面的请求没有出现之前,被引用的页面无法确定时,使用
include动作才合算。
24、尽量使用继承,继承的方法越多,你要写的代码量也就越少。
25、日期类型的对象会占用很大的空间,如果你要存储大量的日期对象,可以考虑把它存储为long类型,然后在使用的时候转换为Date类型。
26、类名、方法名、变量名尽量使用简短的名字。
27、将常量声明为static final,并以大写命名
这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字以大写命名也可以方便区分出常量与变量。
28、不要对超出范围的基本数据类型做向下强制转型
比如从long型转为int型,可能得不到你想要的结果。Java中long型是8个字节64位的,int型是4个字节32位的。

© 著作权归作者所有

共有 人打赏支持
wlc534
粉丝 4
博文 40
码字总数 37684
作品 0

暂无文章

java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0
SpringBoot2.0 停机

最近新建了个SpringBoot2.0的项目,因为原来一直使用的是传统的Tomcat部署war包的形式,所以这次SpringBoot内置Tomcat部署jar包的时候遇到了很多问题。其中一个就是因为没有外置的Tomcat容器...

Canaan_
昨天
0
1
Confluence 6 外部参考

一个外部参考的意思是任何站点链接到你 Confluence 的实例。任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考。 在默认的情况下,外部链接的参考链接...

honeymose
昨天
0
0
Android中的设计模式之抽象工厂模式

参考 《设计模式解析》 第十一章 Abstract Factory模式 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式 《Android源码设计模式解析与实战》第6章 创...

newtrek
昨天
0
0
Redis | 地理空间(GEO)的一个坑

Redis的地理空间(Geo)是个好东西,轻轻松松的就可以把地图描点的问题处理了, 最近却遇到一个坑...Redis采用的Msater-Slave模式, 运用GEORADIUS在salve读取对应的数据,新增了从节点但是从不返...

云迹
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部