文档章节

Java代码性能优化总结

wlc534
 wlc534
发布于 2017/09/07 12:45
字数 2137
阅读 6
收藏 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
粉丝 6
博文 84
码字总数 143947
作品 0
私信 提问
给Java字节码加上”翅膀“的JIT编译器

给Java字节码加上”翅膀“的JIT编译器 上面文章在介绍Java的内存模型的时候,提到过由于编译器的优化会导致重排序的问题,其中一个比较重要的点地方就是关于JIT编译器的功能。JIT的英文单词是...

九劫散仙
06/20
0
0
OSC 第 70 期高手问答 — 实战 Java 虚拟机

OSCHINA 本期高手问答(4月22 日- 4月28日)我们请来了 @葛一鸣(葛一鸣)为大家解答关于 Java 虚拟机的运行原理和程序调优方面的问题。如: 如何定位程序中最消耗资源的代码? 如果处理内存...

叶秀兰
2015/04/22
7.7K
70
《成神之路-基础篇》JVM——JVM参数及调优(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 JVM参数及调优 JVM实用参数系列 成为Java GC专家(5)...

05/05
0
0
DirectByteBuffer更快吗?

ByteBuffer.allocateDirect vs ByteBuffer.allocate 操作系统的IO机制 操作系统在内存区域上执行IO操作,这些内存区域是连续的字节。毫无疑问只有字节缓冲区才有资格参与IO操作的。同样操作系...

智深
2012/12/04
0
0
JVM 优点与缺点的深入分析

Java 最初诞生的时候,它可以说是其他语言的进化版。不仅因为Java很简单,而且这一进化的语言还是一个可以运行第三方硬件字节码的虚拟机。它还是垃圾收集站,从而令存储管理和内核转储(cor...

长平狐
2013/01/06
68
0

没有更多内容

加载失败,请刷新页面

加载更多

结合Spring和Groovy解决脚本热加载

前言 去年写过一篇文件介绍了采用jpython解决动态配置热加载的问题jpython解决热加载,今年在实现规则引擎过程中准备进行升级,采用groovy脚本解决。 方案 将一些规则相关,如统计,排序,过...

春哥大魔王的博客
16分钟前
1
0
以太坊应用开发接口:JSON RPC API

以太坊应用开发接口指的是以太坊节点软件提供的API接口,去中心化应用可以利用这个接口访问以太坊上的智能合约。以太坊应用开发接口采用JSON-PRC标准,通常是通过HTTP或websocket提供给应用程...

汇智网教程
20分钟前
1
0
排序--二分插入排序

二分插入排序是对直接插入排序的一个优化,在排序--直接插入排序中已经分析过直接插入排序的最坏时间复杂度是平方级别的,二分插入排序则是通过二分查找对寻找插入位置进行了优化,在找到插入...

FAT_mt
30分钟前
3
0
Quora点赞过万!麻省理工5.0GPA十条学习技巧

美国版知乎Quora上有个问题是:顶尖学生如何学习。排名第一的答案已经赢得13.5K次点赞,我们翻译出来分享给大家。 MIT normally does not rank its students. So if you hear that someone g...

乔老哥
44分钟前
1
0
IOC的学习(1)

1.IOC理论概要 java中,一个对象A怎么才能调用对象B? 当一个对象的构建,需要多个其他对象时,对象和对象有复杂的构建关系。spring帮助我们维系对象的依赖关系,降低系统的实现成本,前提是...

杨健-YJ
56分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部