要对你的 Java 代码进行优化,需要理解 Java 不同要素之间的相互作用,以及它是如何与其运行时的操作系统进行交互的。使用下面这五个技巧和资源,开始学习如何分析和优化你的代码吧。

在我们开始之前,你也许会担心许可的问题。Java 为 Oracle 公司所有,遵循 Oracle 的 BCL 许可,该许可证不是一个免费/开源许可证。即便如此, 仍然有许多开源项目由 Oracle 公司的 Java 开发。 OpenJDK 是 Java 平台自由软件的实现,遵循 GPL v2 许可。(更多信息请参见维基百科 Free Java implementations。)

让我们开始吧

性能优化取决于多个因素,包括垃圾收集、虚拟机和底层操作系统(OS)设置。有多个工具可供开发人员进行分析和优化时使用,你可以通过阅读 Java Tools for Source Code Optimization and Analysis 来学习和使用它们。如果你正苦苦挣扎于术语和 Java 的原理,可以先去查看 Livecoding Java category page,上面有直播,存档的视频,以及一些其他有用的信息。

视情况而定”

必须要明白的是,没有两个应用程序可以使用相同的优化方式,也没有完美的优化 java 应用程序的参考路径。使用最佳实践并且坚持采用适当的方式处理性能优化。想要达到真正最高的性能优化,你作为一个 Java 开发人员,需要对 Java 虚拟机(JVM)和底层操作系统有正确的理解:

JVM 和底层操作系统:Java 虚拟机是任何 Java 程序的家。阅读 JVM internals guide 了解更多有关于 JVM 内部和操作系统差异的内容。

JVM 分布模型:Java 分布模型为您的应用程序处理多个JVM实例。分布模型提高了应用程序的性能,因为它获得更多的资源来工作。你可以用两种方法继续优化。第一种方法是在一个堆大小为2GB或8GB的单服务器运行多个 JVM。第二种方法是在多个服务器上运行单个 JVM。正确方法的选择取决于多个因素,包括可用性和响应性。

JVM 体系结构:选择正确的 JVM 体系结构对于性能来说是很重要的。你可以选择 64 位或者 32 位的 JVM 机器。 一般来说,32 位 JVM 的性能比它对应的 64 位 JVM 要好。 只有当你需要的堆大小大于 3 GB 时,才选择 64 位的 JVM。

清楚了性能优化和其要素,现在我们可以专注于那些可以优化你的Java应用的技巧。

1. 调整垃圾收集(GC)

由于垃圾收集的复杂性,很难发现你的应用的准确性能。不过,如果你真的想优化你的应用,你应该相应地处理垃圾收集。通用的准则是调整GC设置并同时执行性能分析。

一旦你对结果感到满意,你可以停止该过程并寻求其他优化方式。确保除了在平均事务处理时间之外,你还留心了异常值。这些异常值是造成Java应用缓慢的真正的罪魁祸首并且很难找到。

此外,你要明白应用运行期间性能下降的效应。在每个CPU时钟内,缓慢的操作是可以忽略的,但在每个数据库事务中的缓慢操作则是非常昂贵的消耗。但是你应该根据性能短板选择你的优化策略,并根据工作负载来优化应用。

2. 正确地选择适合你的GC算法

让我们更深入地探讨GC优化。毕竟,GC优化是要处理的整个优化问题中最基本的。目前,Java中有四种供你选择的垃圾收集算法。每种算法满足不同的需求,因此你要选择适合你的需求的。很多开发人员正是因为不了解GC算法而没有优化他们的应用。

这四个算法分别是串行回收器,并行/吞吐量回收器,CMS回收器和G1回收器。想要了解更多关于每种垃圾收集器的信息及它们是如何工作的,请查看这篇来自Takipi博客的非常棒的文章Garbage Collectors—Serial vs. Parallel vs. CMS vs. G1。这篇文章同时还讨论了Java8对GC算法的影响及其他细节上的改变。

让我们再回到GC算法上,根据Understanding Java Garbage Collection这篇文章所述,并发标记和清除GC(即"CMS")算法才是适合网络服务端应用的最佳算法。并行GC算法则适合那些内部可预测的应用。

G1和CMS是并发操作的理想选择,但仍然会引起应用频繁停顿。实际的选择取决于你如何取舍。举例来说,尽管选择并行算法会带来更长的GC停顿时间,但相较于其他GC算法,选择并行算法仍是一个好主意。

3.Java 堆

Java内存堆在迎合内存需求方面担任了至关重要角色。通常更好的做法是,初始时分配最小的堆,然后通过持续的测试不断增加它的大小。大多数时候优化问题都可以通过增加堆的大小解决,但如果存在大量的GC开销,则该解决方案就不起作用。

GC开销还会使吞吐量急剧下降,进而使得应用极其缓慢。此外,及早调整GC可以帮助你避免堆大小分配的问题。开始的时候,你可以选择任何1GB到8GB的堆大小。当你选择正确的堆大小,老生代和新生代对象的概念也就不需要了。

总而言之,堆大小应该取决于老生代和新生代对象的比率,之前的GC优化和对象集合(即所有对象占用的内存大小)。

4. 关键应用优化

关键代码优化是优化你的Java应用最好的方式。如果你的应用对GC和堆优化没有反应,那么最好是做架构改进并关注于你的应用是如何处理信息的。使用聪明的算法并管理好对象就能解决大量的问题,包括内存碎片、堆大小问题和垃圾收集的问题。

5.使用最优的函数

Java提供了多个函数来提升算法效率。如果你使用StringBuilder代替简单的String,你可以得到微乎其微的性能提升。不过,我们还有其他方式在代码层面进行优化。让我们看看下面这些优化方法。

使用StringBuilder代替+操作符。

避免使用iterator()。

多使用栈带来的好处。

避免使用正则表达式,使用Apache Commons Lang作为代替。

远离递归。递归会占用大量资源!

要想查看更多关于代码优化的东西,请阅读《十个最简单的Java性能优化技巧》。

总结

Java的性能优化可是一个大课题,这片文章也只是抛砖引玉。如果您认为文章还需要添加补充,别忘了在下面的评论中分享您的观点。

原文:Dr. Michael J. Garbade

翻译:KeYIKeYI,learner,唯恐有闻

译文:http://coyee.com/article/11118-5-great-java-performance-optimization-tricks

原文:https://opensource.com/life/16/8/5-great-tricks-java-performance-optimization

转载于:https://blog.51cto.com/13672582/2285408

Java 性能优化的五大技巧相关推荐

  1. Java性能优化技巧

    Java性能优化技巧 参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序 ...

  2. Java性能优化的5个技巧

    Java性能优化的5个技巧 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. 要优化Java代码需要正确的分析它的工作机制,影响性能优化有几个因素,比如垃圾收集.操作系统的设置.虚拟机 ...

  3. [原创]Java性能优化权威指南读书思维导图

    [原创]Java性能优化权威指南读书思维导图 书名:Java性能优化权威指南 原书名:Java performance 作者: (美)Charlie Hunt    Binu John 译者: 柳飞 ...

  4. 赠书:《Java性能优化实践》,众多业内大佬推荐阅读

    没有捷径可走的 Java 性能优化 多年来,用 Google 搜索 Java performance tuning,出现的三篇最热门文章之一是于 1997 年到 1998 年左右发表的文章,这篇文章在 ...

  5. java性能优化权威指南_Java性能优化权威指南 PDF扫描[132MB]

    Java性能优化权威指南主要为Java SE 和Java EE 应用的性能调优提供建议.主要包括以下几方面:性能监控.性能分析.Java HotSpot VM 调优.高效的基准测试以及Java EE ...

  6. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  7. java 性能 优化_Java十大简单性能优化

    java 性能 优化 关于" web scale "这个流行词有很多炒作,人们花了很多时间来重新组织他们的应用程序体系结构,以使其系统"规模化". 但是什么是扩 ...

  8. Java 性能优化的七个方向

    了解了优化目标后,那接下来应该从哪些方面入手呢?本文主要侧重于理论分析,我们从整体上看一下 Java 性能优化都有哪些可以遵循的规律.本文主讲理论.关于实践,后续的文章会用较多的案例来细化本文的知识点 ...

  9. 新书上市 | 《Java性能优化实践》,众多业内大佬推荐阅读

    没有捷径可走的 Java 性能优化 多年来,用 Google 搜索 Java performance tuning,出现的三篇最热门文章之一是于 1997 年到 1998 年左右发表的文章,这篇文章在 ...

最新文章

  1. Buffer.isBuffer()详解
  2. Java一致性Hash算法的实现
  3. CMAK找不到相关编译器的问题
  4. 2-3 人工智能需要的基本数学知识|人工智能框架TensorFlow应用实践
  5. micropython随笔-hello,world
  6. STM32(三)-------流水灯(标准库函数)
  7. 花音机器人_【扑杀花音攻略组】超弩级光机器人攻略
  8. 怎么看待苹果公司要求分成微信、知乎打赏32%?
  9. 三部委明确能源互联网建设10重点
  10. 快!100小时免费GPU跑起来!低价又好用的深度学习宝藏平台!
  11. datetime 比较_MySQL时间类型datetime,timestamp,int如何选择,很多程序员收藏了
  12. Atitit 防伪防篡改方法总结关键数据的防篡改检验方法
  13. movielens电影数据分析
  14. 小程序体验版无法显示内容
  15. 微信聊天记录生成词云图
  16. 暗影精灵4如何调节风扇转速_惠普暗影精灵4 简单几步设置让游戏画面更流畅
  17. 手机外放没有声音_手机外放没声音,插入耳机有声音
  18. H-A + B用于投入产出实践(VIII)
  19. python 离群值_数据预处理初学者宝典:360° 掌握离群值识别
  20. 占位符语法-Scala

热门文章

  1. opengl光照效果_【图形学基础 | Shader】Blinn-Phong 光照模型
  2. console线驱动安装_centos7安装docker
  3. php 外部调用内部变量,PHP 如何在方法体外部获取内部变量?
  4. 嵌入式开发笔记-存储控制器
  5. 如何判断车与路边线距离_6家快递公司共享分拣线配送车,效果如何?
  6. 中消协:警惕以治病为噱头的保健品虚假宣传行为
  7. 我国IPv6规模要达到世界第一
  8. DM8168 OpenCV尝试与评估(编译ARM版OpenCV)
  9. Veritas推出全多云环境新技术
  10. CentOS 6.5下SSH总提示Warning: Permanently added '****' (RSA) to the list of known hosts.