文档章节

Java代码性能优化总结

wlc534
 wlc534
发布于 2017/09/07 12:45
字数 2137
阅读 5
收藏 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
给Java字节码加上”翅膀“的JIT编译器

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

九劫散仙 ⋅ 今天 ⋅ 0

《成神之路-基础篇》JVM——JVM参数及调优(已完结)

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

⋅ 05/05 ⋅ 0

JVM 即时编译器 - GraalVM

Graal — 新的 JVM 即时编译器 GraalVM 是新一代的高性能跨语言虚拟机,用于运行 JavaScript、Python 3、Ruby、R、基于 JVM 的语言,如 Java、Scala、Kotlin 和基于 LLVM 的语言,如 C 和 C+...

匿名 ⋅ 2014/09/29 ⋅ 2

编写高性能 Java 代码的最佳实践

摘要:本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。以下是译...

这篇文章 ⋅ 今天 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

java 程序性能调优(总结一:概述)

本系列文章 是博主阅读 《java 程序性能优化》一书的总结。大部分内容来自此书。 性能参考指标 1,执行时间:一段代码从开始运行到结束运行,所使用的时间; 2,CPU时间:函数或者线程占用c...

hamlin ⋅ 2016/04/07 ⋅ 0

深入理解JVM学习笔记(一、总览)

1、JVM历史 2、JVM内存结构 3、JVM垃圾回收机制 4、JVM性能监控工具 5、JVM性能调优案例时间 6、JVM类文件结构 7、JVM类加载机制 8、JVM字节码执行引擎 9、JVM虚拟机编译及其运行时优化 10、...

jintaohahahaha ⋅ 05/28 ⋅ 0

从Java小白到架构师必须要看的书籍,真正的“武林秘籍”!

少年,我看你骨骼精奇,将是未来万中无一的IT精英,很是适合学JAVA。维护世界和平就看你的了,我这里有能让你成为IT精英的办法!还不来看看! 基础类 1、《Thinking in Java》,入门第一位是...

启示录是真的 ⋅ 05/25 ⋅ 0

LINUX类主机JAVA应用程序占用CPU、内存过高分析手段

转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus)。 做为一个IT运维人员,通常在运维过程中会遇到各种各样的问题,系统问...

丁启良 ⋅ 2015/12/04 ⋅ 0

JVM性能调优实践——JVM篇

前言 在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践...

lijingyao8206 ⋅ 05/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 23分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 30分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 37分钟前 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 38分钟前 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 42分钟前 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 46分钟前 ⋅ 0

建造模式

《JAVA与模式》之建造模式

Cobbage ⋅ 今天 ⋅ 0

WePY框架开发的小程序如何在微信web开发者工具中运行起来

一、首先需要安装node.js,安装步骤如下: 首先下载安装包 https://nodejs.org/en/download/ 点击下载相应的zip版本 然后将文件夹解压到任意目录 比如我这里解压到了:C:\Program Files\node...

Helios51 ⋅ 今天 ⋅ 0

使用EnumSet 代替位域(32)

1、位域(Bit field):使用or 运算将几个常量合并到一个集合中 位操作,可以有效地执行 AND 、OR 这样的位操作 但是 位域比int 常量枚举缺点更多 2、java.util 包里面的EnumSet 类是有效的替...

职业搬砖20年 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部