`

JVM远程调试为什么要禁用JIT -Djava.compiler=NONE

阅读更多
为了加快debug的速度。

首先,需要了解JVM对字节码的编译技术。一个JAVA程序通过javac编译成字节码以后,在执行的时候,由JVM将字节码编译成本地机器码,然后再执行。将字节码转换成
机器码,JVM有两种利器,一种就是JIT,还有一种是转译器(interpreter)。

1>转译器

转译器将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能被转译成十几或数十几个对等的微处理器指令,这种模式执行的速度相当缓慢。

2>JIT

针对转译器的速度瓶颈,出现了JIT。JIT针对一个具体的class进行编译,经过编译后的程序,被优化成相当精简的原生型指令码(native code)。编译过一次,下次再执行的时候就不用再次编译了,所以执行次数较多的代码,采用JIT还是十分划算的。但是,JIT也不是万能的,比如:某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,这时候就不如直接使用转译器。

所以,转译器和JIT各有优缺点。
1>极少执行到或者执行次数较少的Java代码,使用转译器更划算。
2>重复执行或者执行次数较多的Java代码,采用JIT更划算。

然后,我们回到JVM远程调试的正题。我们一般debug程序的时候,只是关注其中的一部分代码,而且大部分情况下是设置断点,然后单步执行,而JIT的编译单位是class,只要我们执行了class里面的代码,JIT就会对整个class进行编译,而我们实际执行的代码一般都是其中的一部分代码,所以从整个时间效率上来看,采用JIT反而更费时间。也就是说在JVM远程调试这个事情上,禁用JIT(只使用转译器,解释一行执行一条)更合理,所以通过-Djava.compiler=NONE来禁止JIT。


此外,在程序中也可以即时地禁用和开启JIT。
java.lang.Compiler.disable();

java.lang.Compiler.enable();
分享到:
评论

相关推荐

    如何用Eclipse调试另外一台机器或远程机器上的项目

    - `-Djava.compiler=NONE`:禁止JIT编译,确保源代码级别的调试。 - `-Xrunjdwp`:启动JDWP(Java Debug Wire Protocol),指定使用socket通信,监听8787端口,服务器模式,并且在启动时不暂停。 2. **启动Tomcat...

    IBM JVM参数选项

    2. **-Djava.compiler**: 设置编译器类型,如果设置为`NONE`则禁用JIT编译器。 - 示例:`-Djava.compiler=NONE` 3. **-Djavax.xml.namespace.QName.useCompatibleHashCodeAlgorithm**: 控制`QName`类中的哈希码...

    dfd参数设置.txt

    其中,`-Xnoagent`用于禁止使用默认的代理,`-Djava.compiler=NONE`禁用了JIT编译器。 - **Weblogic**: 对于Weblogic服务器,可以在`startWebLogic.bat`文件中设置如下参数: ```sh set JAVA_OPTIONS=-Xdebug ...

    springboot远程调试(eclipse篇)

    3. **-Djava.compiler=NONE**:禁用 JIT 编译器,这有助于调试。 4. **-Xrunjdwp**:加载 JDWP (Java Debug Wire Protocol) 的 JPDA (Java Platform Debugger Architecture) 实现,它是 Java 官方提供的调试协议。 ...

    Eclipse 远程调试Tomcat的应用

    - `-Djava.compiler=NONE`:禁用JIT编译器。 - `-Xrunjdwp`:启用JDWP(Java Debug Wire Protocol)实现,用于远程调试。 - `transport=dt_socket`:设置传输方式为socket。 - `server=y`:表明当前JVM是被调试...

    Linux 中Tomcat远程调试代码的实现方法

    - `-Djava.compiler=NONE`:禁止JIT编译器,使得我们可以使用远程调试。 - `-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5888`:配置JDWP(Java Debug Wire Protocol)参数,其中: - `transport=dt...

    公司内部培训jconsole

    对于远程调试,可以使用 `-Xdebug`、`-Xnoagent`、`-Djava.compiler=NONE` 和 `-Xrunjdwp` 参数来配置,例如在 Linux 环境下,通过 `startup.sh jpda` 启动服务,默认监听8000端口。在 Eclipse 等集成开发环境中,也...

    WebSphere修改中文乱码.pdf

    1. `-Djava.compiler=NONE`: 这个参数用于禁用JIT(Just-In-Time)编译器,通常在进行远程调试时使用,防止编译过程干扰调试。在这个场景下,它并不直接影响中文乱码问题,但保持不变即可。 2. `-Xdebug`: 启用JVM...

    2020-review-7-jvm.pptx

    - **扩展类加载器**(Extension ClassLoader): 它负责加载扩展类库,这些类库通常位于 JDK 的安装目录下的 `lib/ext` 或者由 `-Djava.ext.dirs` 指定的目录中。 - **应用类加载器**(Application ClassLoader): 这...

    eclipse内存溢出处理

    `-Djava.compiler=NONE` 该参数用于禁用JIT(Just-In-Time)编译器,即即时编译器,它会将部分字节码编译为机器码,以提高程序的运行速度。但在某些情况下,禁用JIT可以减少内存消耗,避免因编译过程中的内存需求...

    JNI 简介与实现.zip

    2. 调试:使用Java的`-Djava.compiler=NONE`选项禁用即时编译(JIT),可以使调试更方便。此外,还可以使用专门的JNI调试工具或集成在IDE中的调试功能。 六、实例应用 1. 访问操作系统API:JNI常用于调用操作系统...

    Tomcat中文帮助文档.rar

    2. 调试模式:通过-Djava.compiler=none启动Tomcat,禁用JIT编译以获取更详细的调试信息。 八、集群与负载均衡 1. Tomcat集群:通过复制应用程序和共享Session状态,实现多台Tomcat服务器间的负载均衡。 2. 配合...

    JVM配置参数说明

    此参数指示JVM使用混合模式执行代码,即同时使用解释器和即时编译器(JIT Compiler),以平衡启动速度和运行效率。 2. **-Xint**: 解释模式执行。仅使用解释器执行Java代码,适用于调试和开发环境,牺牲运行效率...

    Java习题

    - Java字节码是为Java虚拟机(JVM)设计的,而不是直接针对特定硬件的机器指令集。 - 其他机器代码是特定于硬件的指令集合,用于直接执行在处理器上。 9. **编译器与解释器的区别** - 编译器将源代码一次性转换...

    21天学通JAVA(清晰版).pdf

    - **高性能**:虽然Java是解释型语言,但通过即时编译器(JIT Compiler)等技术,其执行效率接近于C/C++等编译型语言。 #### 二、Java平台分类 - **Java SE (Standard Edition)**:标准版Java,适用于桌面应用程序和...

    java面试必会200题.docx

    为什么Java被称作是“平台无关的编程语言”** - Java虚拟机(JVM)是一个可以执行Java字节码的虚拟机环境。 - Java被称为“平台无关”的原因在于,Java程序在任何安装了JVM的操作系统上都能运行相同的字节码。 30. ...

    面试_JAVA_宝典—最全的总结.doc

    - **高性能(High performance)**:尽管Java最初被认为是解释性的,但通过即时编译器(JIT Compiler)等技术的优化,其实现了较高的性能。 - **分布式(Distributed)**:Java语言的设计充分考虑了网络应用的需求,...

    JavaCompiler

    Java编译器是Java开发中的核心工具,它将程序员编写的源代码(.java文件)转换为可执行的字节码(.class文件),这个过程称为编译。Java的编译器是JDK(Java Development Kit)的一部分,通常被称为javac。在深入...

    java自考简答题 java考试

    4. **解释执行**:JVM解释执行字节码,或者通过即时编译器(JIT Compiler)将其转换为机器码执行。 ### 源文件规则 Java源文件遵循以下规则: - **公共类名与文件名相同**:如果源文件包含一个公共类,则该公共类...

Global site tag (gtag.js) - Google Analytics