Java|Java性能优化的7个方向,不看你后悔( 三 )


只有并发 , 才能产生资源冲突 。 也就是在同一时刻 , 只能有一个处理请求能够获取到共享资源 。 解决资源冲突的方式 , 就是加锁 。 再比如事务 , 在本质上也是一种锁 。
按照锁级别 , 锁可分为乐观锁和悲观锁 , 乐观锁在效率上肯定是更高一些;按照锁类型 , 锁又分为公平锁和非公平锁 , 在对任务的调度上 , 有一些细微的差别 。
对资源的争用 , 会造成严重的性能问题 , 所以会有一些针对无锁队列之类的研究 , 对性能的提升也是巨大的 。
06

算法优化
算法能够显著提高复杂业务的性能 , 但在实际的业务中 , 往往都是变种 。 由于存储越来越便宜 , 在一些 CPU 非常紧张的业务中 , 往往采用空间换取时间的方式 , 来加快处理速度 。
算法属于代码调优 , 代码调优涉及很多编码技巧 , 需要使用者对所使用语言的 API 也非常熟悉 。 有时候 , 对算法、数据结构的灵活使用 , 也是代码优化的一个重要内容 。 比如 , 常用的降低时间复杂度的方式 , 就有递归、二分、排序、动态规划等 。
一个优秀的实现 , 比一个拙劣的实现 , 对系统的影响是非常大的 。 比如 , 作为 List 的实现 , LinkedList 和 ArrayList 在随机访问的性能上 , 差了好几个数量级;又比如 , CopyOnWriteList 采用写时复制的方式 , 可以显著降低读多写少场景下的锁冲突 。 而什么时候使用同步 , 什么时候是线程安全的 , 也对我们的编码能力有较高的要求 。
这部分的知识 , 就需要我们在平常的工作中注意积累 , 后面的课时中 , 也会挑比较重要的知识点穿插讲解 。
高效实现
【Java|Java性能优化的7个方向,不看你后悔】在平时的编程中 , 尽量使用一些设计理念良好、性能优越的组件 。 比如 , 有了 Netty , 就不用再选择比较老的 Mina 组件 。 而在设计系统时 , 从性能因素考虑 , 就不要选 SOAP 这样比较耗时的协议 。 再比如 , 一个好的语法分析器(比如使用 JavaCC) , 其效率会比正则表达式高很多 。
总之 , 如果通过测试分析 , 找到了系统的瓶颈点 , 就要把关键的组件 , 使用更加高效的组件进行替换 。 在这种情况下 , 适配器模式是非常重要的 。 这也是为什么很多公司喜欢在现有的组件之上 , 再抽象一层自己的;而当在底层组件进行切换的时候 , 上层的应用并无感知 。
07

JVM 优化
因为 Java 是运行在 JVM 虚拟机之上 , 它的诸多特性 , 就要受到 JVM 的制约 。 对 JVM 虚拟机进行优化 , 也能在一定程度上能够提升 JAVA 程序的性能 。 如果参数配置不当 , 甚至会造成 OOM 等比较严重的后果 。
目前被广泛使用的垃圾回收器是 G1 , 通过很少的参数配置 , 内存即可高效回收 。 CMS 垃圾回收器已经在 Java 14 中被移除 , 由于它的 GC 时间不可控 , 有条件应该尽量避免使用 。
JVM 性能调优涉及方方面面的取舍 , 往往是牵一发而动全身 , 需要全盘考虑各方面的影响 。 所以了解 JVM 内部的一些运行原理 , 还是特别重要的 , 它有益于我们加深对代码更深层次的理解 , 帮助我们书写出更高效的代码 。
08

小结
以上就是代码优化的 7 个大方向 , 我们通过简要的介绍 , 让大家对性能优化的内容有了大体的了解 。 这7大方向是代码优化的最主要方向 , 当然 , 性能优化还包含数据库优化、操作系统优化、架构优化等其他一些内容 , 这些不是我们的重点 , 在后面的文章中 , 我们也只做简要的介绍 。
接下来 , 我们会了解一些性能评估工具 , 了解操作系统的一些资源限制 , 然后针对这7个优化点 , 进行展开讨论 。 本文时适合案例分析后回读 , 更加能够加深你对 Java 性能优化的理解 。