`

【Java核心-性能基础】JVM 对代码执行的优化

    博客分类:
  • Java
 
阅读更多

1. JVM 对代码执行的两类优化

1.1 运行时优化

主要是针对解释执行和动态编译的一些通用机制的优化。如,锁(包括偏斜锁)和内存分配(如 TLAB)。

还包括一些专门优化解释执行效率的机制。如,模板解释器、内联缓存(优化虚方法调用的动态绑定)。

 

1.2 JIT优化

JVM根据运行时统计信息(Profile),动态决定部分方法(热点代码)被编译成机器码,直接运行在底层硬件上。

JIT 编译器的技术有 方法计数器、循环展开(Loop unrolling)、方法内联、无效代码消除(Dead Code Elimination)、逃逸分析、分支预测(Branch Prediction)等

这些编译所得的机器码会被暂存于Code Cache。

因为Code Cache容量有限,所以当热点代码不再是热点时,其对应的本地代码会被从Code Cache中移除。这就是 逆优化



 

 

 

栈上替换技术(OSR,On-Stack Replacement)

针对热点循环代码,如果方法本身的调用频度还未达到编译标准,但是内部有大的循环,那么该方法还是会被判定为有优化价值而被编译。

 

2. 探查JVM优化的具体情况

针对Java编译期优化,我们可以通过反编译工具查看被优化的细节(如,常量折叠)

针对JVM运行期间的优化,我们一般通过设置启动参数让JVM输出相关日志,或一些专门的监控工具来查看相关细节。(《JVM内存监控与诊断》)

 

2.1 打印编译发生的细节

-XX:+PrintCompilation

 

输出更多编译细节:

-XX:UnlockDiagnosticVMOptions -XX:+LogCompilation -XX:LogFile=<your_file_path>

可通过 JitWatch 查看日志文件。(分析指南) 

 

2.2 打印内联发生的细节

-XX:PrintInlining

 

2.3 查看 Code Cache 的使用情况

JMC、JConsole等工具

 

3. JVM 代码执行优化的调优角度和手段

3.1 调整热点代码门限值

-XX:CompileThreshold=N

通常是降低该值,以降低预热时间。

server模式默认10000次,client模式默认1500次

此外,JVM 会周期性的对方法计数的数值进行衰减,从而导致某些代码永远都达不到默认的热点代码门限值。所以降低降低该门限值可以让这些代码有机会成为热点。

当然也可以关闭计数衰减 -XX:-UseCounterDecay

 

3.2 调整 Code Cache 大小

-XX:ReservedCodeCacheSize=<SIZE>

通常是增大其容量,以容纳更多编译后的代码。

调整其初始容量:

-XX:InitialCodeCacheSize=<SIZE>

 

3.3 调整编译器线程数,或选择适当的编译器模式

JVM的编译器线程数与JVM的模式有关。

client模式默认只有一个编译线程(C1,Client Compiler)

server模式默认是两个(C2,Sever Compiler)

HotSpot 默认启用了分层编译(Tiered-Compilation),JVM会根据CPU内核数计算C1 和 C2 的数值。

可以通过启动参数指定编译线程数。-XX:CICompilerCount=N

 

如果CPU核数多资源足,可以增大编译线程数,以充分利用资源,加快相关优化执行过程。

如果CPU资源少,或系统中有多个应用在争抢资源,则可以考虑减少编译线程数,降低线程切换的开销。

但是,通常可以在服务器上关闭分层编译(-XX:-TieredCompilation)。虽然预热速度稍慢,但省下的CPU资源可能提高某些业务场景的吞吐量。

“优化”没那么高大上,就怕瞎捣腾,毫无章法地胡乱设置一通浪费时间。

其实JVM已经优秀到足以应付绝大多数场景了。通常都无需这么冷门艰涩的调优手段。

性能差往往是因为业务代码本身有逻辑硬伤,或是服务器性能(包括网络环境)真的不行。

绝大对数Java项目组织根本没资格在这个层面拼优化,做好需求、设计和工程管理就已经有资格评优了。

  • 大小: 19.9 KB
分享到:
评论

相关推荐

    Java虚拟机-jvm故障诊断与性能优化-源码

    在《实战Java虚拟机——JVM故障诊断与性能优化》一书中,作者深入探讨了如何对JVM进行故障排查和性能调优,通过源码分析来帮助读者理解其内部工作原理。下面我们将根据书中的主题,详细阐述相关的知识点。 1. **JVM...

    java11-jvm白皮书

    Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行Java程序。在Java 11中,JVM继续提供跨平台的兼容性和高效的运行环境。它将Java源代码编译成字节码,然后在运行时动态地解释或即时编译为机器码,实现了“一...

    2015-09-12-Java虚拟机详解----JVM常见问题总结【面试必问】

    Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释执行字节码并管理内存。本篇文章将深入探讨JVM的一些常见问题,这些内容对于理解和优化Java应用程序至关重要,同时也是面试中的高频考察点。 一、JVM内存...

    框架->java语言->jvm->os->汇编->硬件

    标题 "框架-&gt;java语言-&gt;jvm-&gt;os-&gt;汇编-&gt;硬件" 描述了一条技术学习路径,从上至下深入理解软件开发的核心技术栈。这个路径涵盖了从应用框架到底层硬件的关键环节,让我们逐步解析其中涉及的知识点: 1. **框架**:...

    实战Java虚拟机——JVM故障诊断与性能优化

    《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发人员和运维人员必备技能的书籍。本书作者葛一鸣以其丰富的实战经验,详细阐述了JVM(Java Virtual Machine)的工作原理,以及如何有效地进行故障...

    Java核心技术------源代码

    9. **JVM内存管理**:Java虚拟机(JVM)负责垃圾收集和内存管理,理解堆、栈、方法区等内存区域对优化程序性能至关重要。 10. **注解(Annotation)**:注解提供了一种元数据的方式,用于向编译器或JVM提供额外的...

    揭秘Java虚拟机-JVM设计原理与实现

    《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行字节码,为Java程序提供跨平台的运行环境。在深入理解JVM内核的运行机制时,我们需要关注以下几个关键点: 1. **类加载机制**:JVM通过类加载器将类文件加载...

    实战JAVA虚拟机 JVM故障诊断与性能优化.pdf

    《实战JAVA虚拟机 JVM故障诊断与性能优化》是一本深度剖析Java虚拟机(JVM)的实战型书籍,旨在帮助读者理解JVM的工作原理,掌握JVM的故障诊断技巧,以及进行有效的性能优化。在Java开发中,JVM扮演着至关重要的角色...

    实战JAVA虚拟机 JVM故障诊断与性能优化.rar

    《实战JAVA虚拟机 JVM故障诊断与性能优化》是一本深度探讨Java虚拟机(JVM)的专著,旨在帮助开发者解决实际工作中遇到的JVM相关问题,提升系统的性能表现。通过对JVM内部机制的深入理解,我们可以更有效地调试、...

    java11-jvm白皮书_java_govwe_

    在JVM性能方面,JEP 330(String in Switch)改进了`switch`语句的行为,允许直接比较字符串,提高了代码的简洁性和执行效率。此外,JEP 323( Flight Recorder)提供了一套低开销的事件记录系统,用于收集诊断和...

    【IT十八掌徐培成】Java基础第25天-06.JVM结构1.zip

    Java虚拟机(JVM)是Java程序运行的核心,它是一个抽象的计算机系统,负责执行Java字节码。在"【IT十八掌徐培成】Java基础第25天-06.JVM结构1"的课程中,我们将会深入探讨JVM的内部结构,了解它是如何使得Java具有跨...

    实战Java虚拟机 JVM故障诊断与性能优化 葛一鸣

    《实战Java虚拟机 JVM故障诊断与性能优化》是由葛一鸣编著的一本专业书籍,主要探讨了如何在实际工作中解决Java虚拟机(JVM)的相关问题,以及如何进行性能调优。书中涵盖了许多关键的知识点,让我们一一展开讨论。 ...

    03-VIP-JVM内存分配机制与垃圾回收算法1

    Java虚拟机(JVM)内存分配机制和垃圾回收(Garbage Collection, GC)是Java编程中的核心概念,它们直接影响到程序的性能和稳定性。本文主要围绕JVM内存区域的分配策略,尤其是对象在新生代(Young Generation)的...

    graalvm-ce-java11-linux-amd64-21.0.0.2.tar.gz

    2. 高性能:GraalVM引入了即时编译器(JIT)和静态编译器(AOT),其中Graal JIT在优化模式下能够生成接近原生代码的性能,显著提升应用程序的运行效率。 3. GraalVM Native Image:这是一个强大的工具,允许开发者...

    JVM-SANDBOX基于JVM的实时无侵入AOP框架容器

    这个框架的核心在于其对Java类加载机制的深入理解和利用,使得可以在不修改原始代码的情况下,对运行中的程序进行动态拦截和处理。 AOP(Aspect-Oriented Programming)是一种编程范式,它将关注点分离,使得系统中...

    【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc.zip

    JVM(Java虚拟机)是Java语言的核心组成部分,它使得Java程序能够跨平台运行。在本课程"【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc"中,我们将深入探讨JVM的结构、`finalize`方法以及垃圾收集...

    实战JAVA虚拟机 JVM故障诊断与性能优化带源码

    《实战JAVA虚拟机 JVM故障诊断与性能优化》是一本深度探讨Java虚拟机(JVM)的书籍,旨在帮助开发者解决在实际工作中遇到的JVM相关问题,提升系统的性能。这本书提供了丰富的源码实例,让读者能够深入理解JVM的工作...

    JAVA 面经--JVM,spring框架,分布式,数据库

    在Java开发领域,面试往往涉及核心的技术点,包括JVM(Java虚拟机)、Spring框架、分布式系统以及数据库管理。这些都是Java开发者必须掌握的关键知识点,也是面试官常常关注的重点。 首先,我们来深入了解一下JVM。...

    JAVA文件编译执行与虚拟机(JVM)介绍

    ### JAVA文件编译执行与虚拟机(JVM)介绍 #### 关键知识点概述: ...通过对JAVA文件编译、字节码执行及JVM工作原理的深入了解,JAVA程序员能够更好地掌握JAVA编程的核心技术,并有效地解决实际开发中的问题。

Global site tag (gtag.js) - Google Analytics