文档章节

Java代码性能优化总结

wlc534
 wlc534
发布于 2017/09/12 10:17
字数 2137
阅读 4
收藏 0
点赞 0
评论 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
博文 31
码字总数 33237
作品 0

暂无相关文章

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部