java性能优化
2017-07-18 09:58
148 查看
尽量指定类、方法的final修饰符
Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。
尽量重用对象
比如String, 尽量使用Stringbuilder/StringBuffer
尽量使用局部变量
及时关闭流
尽量减少对变量的重复计算
建议替换为:
尽量采用懒加载的策略,即在需要的时候再创建。
建议替换为:
慎用异常
不要在循环中使用try….catch ,应将try放在循环外层
如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度
当复制大量数据时,使用system.arraycopy() 命令,
乘法和除法使用移位操作
用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为:
循环内不要不断的创建对象使引用
这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,建议为改为:
这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object罢了,但是内存中只有一份,这样就大大节省了内存空间了
尽量在合适的地方使用单例
单例主要适用以下方面
(1) 控制资源的使用,通过线程同步来控制资源的并发访问
(2) 控制实例的产生,以达到节约资源的目的
(3) 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信
尽量避免随意使用静态变量
当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的
使用同步代码块替代同步方法
这点在多线程模块中的synchronized锁方法块一文中已经讲得很清楚了,除非能确定一整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要进行同步的代码也进行了同步,影响了代码执行效率。
将常量声明为static final,并以大写命名
不要创建一些不使用的对象,不要导入一些不使用的类
程序运行过程中避免使用反射
使用带缓冲的输入输出流进行IO操作
顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList
字符串变量和字符串常量equals的时候将字符串常量写在前面
Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。
尽量重用对象
比如String, 尽量使用Stringbuilder/StringBuffer
尽量使用局部变量
及时关闭流
尽量减少对变量的重复计算
for (int i = 0; i < list.size(); i++) {...}
建议替换为:
int lenght = list.size(); for (int i = 0, i < length; i++) {...}
尽量采用懒加载的策略,即在需要的时候再创建。
String str = "aaa"; if (i == 1) { list.add(str); }
建议替换为:
if (i == 1) { String str = "aaa"; list.add(str); }
慎用异常
不要在循环中使用try….catch ,应将try放在循环外层
如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度
当复制大量数据时,使用system.arraycopy() 命令,
乘法和除法使用移位操作
for (val = 0; val < 100000; val += 5) { a = val * 8; b = val / 2; }
用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为:
for (val = 0; val < 100000; val += 5) { a = val << 3; b = val >> 1; }
循环内不要不断的创建对象使引用
for (int i = 1; i <= count; i++) { Object obj = new Object(); }
这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,建议为改为:
Object obj = null; for (int i = 0; i <= count; i++) { obj = new Object(); }
这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object罢了,但是内存中只有一份,这样就大大节省了内存空间了
尽量在合适的地方使用单例
单例主要适用以下方面
(1) 控制资源的使用,通过线程同步来控制资源的并发访问
(2) 控制实例的产生,以达到节约资源的目的
(3) 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信
尽量避免随意使用静态变量
当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的
使用同步代码块替代同步方法
这点在多线程模块中的synchronized锁方法块一文中已经讲得很清楚了,除非能确定一整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要进行同步的代码也进行了同步,影响了代码执行效率。
将常量声明为static final,并以大写命名
不要创建一些不使用的对象,不要导入一些不使用的类
程序运行过程中避免使用反射
使用带缓冲的输入输出流进行IO操作
顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList
字符串变量和字符串常量equals的时候将字符串常量写在前面
相关文章推荐
- java程序性能优化之设计优化--设计模式:单例模式(1)
- Java程序性能优化 读书笔记(十六)集合访问优化
- Java性能优化:基本类型 vs 引用类型
- Java性能优化:垃圾回收(GC) (转文)
- Android性能优化第三篇--java程序优化
- java性能优化 –gc日志收集与分析
- Java 代码性能优化总结
- Java性能优化技巧集锦
- Java性能优化技巧集锦 3
- 从虚拟机视角谈 Java 应用性能优化
- Java程序性能优化总结--------数据类型篇
- 10种简单的Java性能优化
- java性能提升优化
- 如何优化JAVA程序开发,提高JAVA性能
- Java性能优化指南系列(二):Java 性能分析工具
- java性能优化入门知识点
- java性能优化(二)
- 菜鸟要做架构师(二)——java性能优化之for循环
- Java性能优化:正确的解析JSON文件
- Java性能优化技巧集锦