局部决定整体。一个应用的整体性能取决于每个组件的性能。下面是一些帮助你提高应用性能的Java编程技巧:
编程技巧 |
原因及策略 |
避免重复创建对象 |
为什么:
- 更少的对象会需要更少的垃圾回收
- 使用的空间越少,应用的性能越好
怎么做:
- 重复利用一个对象,而不是在每次需要的时候都去创建一个功能一样的对象
- (这样做)
- String s = “No longer silly”;
- (不要这样)
- String s = new String(“silly”);
- 不可变类中既提供构造函数,又提供了静态工厂方法的,优先考虑使用静态工厂方法。
- 复用那些一旦初始化(使用静态初始化)就不会改变的对象
|
避免循环引用 |
为什么:
- 一组相互引用的对象,如果他们没有被其他对象直接引用的话,它们会变得不可达,这样会导致它们一直都保留在内存里。
怎么做:
- 你可以使用强引用来表示“父到子“的引用关系,使用弱引用来表示“子到父”的引用关系。
|
使用==操作符来替代equals(Object)方法 |
为什么:
- ==操作符的性能更好
- 例如,对于字符串比较,equals()方法会去比较字符串对象里的字符。==操作符会比较两个对象的引用,来比较它们是否指向同一个实例。
怎么做:
- 当且仅当a == b 的时候才会有a.equals(b)
- 例如,对于重复调用的地方,使用静态工厂方法来返回相同的对象。
|
清除无用的对象的引用 |
为什么:
- 无用的对象引用会导致更多的垃圾回收动作,从而降低性能
- 无用的对象引用会导致更多的内存占用,从而降低性能
怎么做:
- 如果一个引用时废弃的话,把它设置为null
- (这样做)
-
1
2
3
4
5
6
7
8
|
public
Object pop() {
if (size ==
0 )
throw new
EmptyStackException();
Object result = elements[--size];
elements[size] = null ;
return result;
}
|
- (不要这样)
-
1
2
3
4
5
|
public
Object pop(){
if (size ==
0 )
throw new
EmptyStackException();
return elements[--size];
}
|
|
避免使用finalizer |
为什么:
- 垃圾回收器需要单独记录等待终结的对象
- 调用finalize方法也有一定的开销
- Finalizer是不安全的,因为它有可能会复活一个对象,这样会干扰垃圾回收。
|
避免使用引用对象 |
为什么:
- 和finalizer一样,垃圾回收器需要特别处理软引用、弱引用以及幽灵引用。
- 尽管引用对象在某些方面很有作用,例如,简化cache的实现,但是大量引用对象的存在会使得垃圾回收运行缓慢。
- 记录一个引用对象的开销远远超过一个普通对象(强引用)的开销
|
避免使用对象池 |
为什么:
- 对象池不仅会使得更多的数据对象保持活动,同时会使得对象的存活时间延长
- 值得注意的是,大量存活的数据对象的处理是GC的瓶颈,GC被优化成适合于处理许多寿命较短的对象
- 并且,创建新的对象而不是保持旧的对象存活,会对缓存的局部性有益
- 不过,在一个包含大量大对象的环境下,例如大的数组,性能或许会因为使用对象池而有所提升。
|
选择好的算法和数据结构 |
为什么:
- 考虑一下通过链表来实现队列的场景
- 即使你的程序不需要遍历整个链表,但是垃圾回收器还是需要这样做的。
- 如果元素的封装者没有把元素没有把元素放在内存中邻近的位置,这样会破坏缓存局部性。因而会导致程序长时间的暂停,尤其是对象的指针分散在一个很大的堆区时,垃圾回收器会在标记阶段追随指针的时候频繁遭遇缓存失效。
|
避免使用System.gc |
为什么:
- Java语言规范里没有保证调用System.gc会做什么事情。如果它规定了的话,或许会超出你的期望,也或许每次调用都做不同的事情。
|
避免使用太多的线程 |
为什么:
- 进程上下文切换的次数会随着要调度的进程的数目相应地增长,这样会对性能有隐性的影响。
- 例如,Intel A-64处理器上的本地线程上下文的大小大概是几千KB
|
避免使用竞争锁 |
为什么:
- 竞争锁一般都是程序的瓶颈,因为它的出现意味着多个线程想访问同一个资源或者执行同一段代码。
|
避免不需要的异常 |
为什么:
- 异常处理会占用一定的事件,并且会打断程序的正常执行流程。
- 作者曾经遇到这样一场景,在客户的应用里,一个正常的执行流程每秒会抛出成千上万的NullPointerException。这个错误被纠正后,应用的性能里面有了一个数量级的提升。
|
避免使用大对象 |
为什么:
- 大对象有时候需要直接在堆而不是在线程本地存储区(thread local areas, TLA)进行内存分配。
- 大对象直接在堆上分配是有坏处的,因为它会更快地产生内存碎片。
- 在虚拟机(例如JRockit)上分配大对象会降低性能,因为分配内存的时候会使用堆的全局锁。
- 过度使用大对象会造成频繁的全栈压缩,这样做是具有破坏性的,而且这样会导致导致所有的线程暂停很长一段时间。
|
参考书籍
- Oracle JRockit
- Effective Java by Joshua Bloch
英文原文:xmlandmore,编译:ImportNew-朱伟杰
译文链接:http://www.importnew.com/1531.html
【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
分享到:
相关推荐
性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...
Java 代码性能优化技巧总结 Java 代码性能优化是每个 Java 开发者都需要掌握的重要技能。以下是对 Java 代码性能优化的各种技巧的总结: 字符串池的实现 在 Java 中,字符串池(String Intern Pool)是通过使用...
Java性能优化是提升软件效率和用户体验的关键步骤,涵盖了多种技术和策略。本文将深入探讨Java通用篇、J2EE篇、GUI篇、EJB篇以及缓存优化等方面的知识点,旨在帮助开发者实现更高效的代码。 一、Java通用篇 在Java...
性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...
"Java性能优化技巧集锦"可能包含了多个方面的内容,旨在帮助开发者掌握如何在Java平台上实现最优的性能表现。 首先,Java性能优化的核心在于理解和运用JVM(Java虚拟机)的工作原理。这包括了解类加载机制、内存...
Java性能优化是IT行业中至关重要的一个领域,尤其是在大型企业级...通过阅读和学习这四本书籍,开发者不仅可以掌握Java性能优化的基础知识,还能了解到最佳实践和实用技巧,从而在实际工作中有效地提升软件系统的性能。
在Java实际开发中,开发者经常会遇到各种挑战,需要掌握一些实用的小技巧来提高代码质量、提升效率。以下是一些从博客文章"Java实际开发中的小技巧汇总"中可能涵盖的知识点,结合“源码”和“工具”的标签,我们可以...
### Java代码性能优化23种技巧详解 #### 一、避免在循环条件中使用复杂表达式 在Java中,尤其是在不进行编译器优化的情况下,循环条件会在每次迭代时都被重新计算。如果循环条件涉及复杂的表达式或者动态计算,这...
Java性能优化是提升软件效率和用户体验的关键环节,尤其是在大规模应用和高并发场景中。本教程将深入探讨如何通过...这个"JAVA优化编程"PDF教程将引导你逐步掌握这些核心技巧,助你在Java性能优化的道路上更进一步。
### Java开发中的常用小技巧详解 #### JDBC使用技巧与注意事项 **1. 使用PreparedStatement代替Statement** 在Java中,利用JDBC操作数据库时,我们经常需要动态构建SQL语句。直接使用`Statement`来构建这样的SQL...
在《大话JAVA性能优化》的PDF文档中,你将找到这些方面的详细讨论和实例分析,它不仅涵盖了理论知识,还提供了实战技巧和工具使用,是Java开发者进行性能优化的宝贵参考资料。通过深入学习和实践,开发者可以提升...
在日常开发中,掌握一些Java小技巧可以显著提高代码的可读性和性能: 1. **利用Optional类防止NullPointerException**:Java 8引入了Optional类,它可以帮助开发者避免空指针异常。通过使用Optional包装可能为空的...
Java性能优化是软件开发中的一个关键领域,尤其是在大型企业级应用和高并发系统中。《Java性能优化》一书深入探讨了如何通过各种技术提升Java应用程序的效率和响应速度。以下是一些基于书籍源码和相关文件名的关键...
### Java性能调优概述 #### 一、性能优化的重要性与基本概念 在现代软件开发中,性能优化是一项至关重要的任务。对于Java开发者来说,优化...希望读者能够在实践中不断探索,掌握更多关于Java性能调优的知识和技巧。
它主要用于诊断Java应用程序中的内存泄漏和理解对象内存占用情况,是Java性能优化的重要助手。在这个"MAT Eclipse MemoryAnalyzer java性能分析"主题中,我们将深入探讨MAT的核心功能、使用方法以及如何通过它来提升...
对 Java 工程师而言,性能优化能力决定了你能否进入大厂或成为一名高级工程师。但性能优化的能力却极难提升,如果你缺乏正确的方法论和实战演练,则很容易事倍功半。 视频大小:1.2G
本资料集锦主要涵盖了Java性能优化的多个方面,包括但不限于代码优化、内存管理、系统设计与优化等关键领域。 一、Java程序性能优化(23条) 1. **避免过度使用反射**:反射在某些场景下很有用,但其开销较大,应...
Java 性能优化技巧集锦 Java 性能优化是 Java 开发中非常重要的一个方面,好的性能优化可以提升应用程序的运行效率和用户体验。在这篇文章中,我们将总结一些 Java 性能优化的技巧,包括通用篇、J2EE 篇、GUI 篇和 ...