为了加快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();
分享到:
相关推荐
- `-Djava.compiler=NONE`:禁止JIT编译,确保源代码级别的调试。 - `-Xrunjdwp`:启动JDWP(Java Debug Wire Protocol),指定使用socket通信,监听8787端口,服务器模式,并且在启动时不暂停。 2. **启动Tomcat...
2. **-Djava.compiler**: 设置编译器类型,如果设置为`NONE`则禁用JIT编译器。 - 示例:`-Djava.compiler=NONE` 3. **-Djavax.xml.namespace.QName.useCompatibleHashCodeAlgorithm**: 控制`QName`类中的哈希码...
其中,`-Xnoagent`用于禁止使用默认的代理,`-Djava.compiler=NONE`禁用了JIT编译器。 - **Weblogic**: 对于Weblogic服务器,可以在`startWebLogic.bat`文件中设置如下参数: ```sh set JAVA_OPTIONS=-Xdebug ...
3. **-Djava.compiler=NONE**:禁用 JIT 编译器,这有助于调试。 4. **-Xrunjdwp**:加载 JDWP (Java Debug Wire Protocol) 的 JPDA (Java Platform Debugger Architecture) 实现,它是 Java 官方提供的调试协议。 ...
- `-Djava.compiler=NONE`:禁用JIT编译器。 - `-Xrunjdwp`:启用JDWP(Java Debug Wire Protocol)实现,用于远程调试。 - `transport=dt_socket`:设置传输方式为socket。 - `server=y`:表明当前JVM是被调试...
- `-Djava.compiler=NONE`:禁止JIT编译器,使得我们可以使用远程调试。 - `-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5888`:配置JDWP(Java Debug Wire Protocol)参数,其中: - `transport=dt...
对于远程调试,可以使用 `-Xdebug`、`-Xnoagent`、`-Djava.compiler=NONE` 和 `-Xrunjdwp` 参数来配置,例如在 Linux 环境下,通过 `startup.sh jpda` 启动服务,默认监听8000端口。在 Eclipse 等集成开发环境中,也...
1. `-Djava.compiler=NONE`: 这个参数用于禁用JIT(Just-In-Time)编译器,通常在进行远程调试时使用,防止编译过程干扰调试。在这个场景下,它并不直接影响中文乱码问题,但保持不变即可。 2. `-Xdebug`: 启用JVM...
- **扩展类加载器**(Extension ClassLoader): 它负责加载扩展类库,这些类库通常位于 JDK 的安装目录下的 `lib/ext` 或者由 `-Djava.ext.dirs` 指定的目录中。 - **应用类加载器**(Application ClassLoader): 这...
`-Djava.compiler=NONE` 该参数用于禁用JIT(Just-In-Time)编译器,即即时编译器,它会将部分字节码编译为机器码,以提高程序的运行速度。但在某些情况下,禁用JIT可以减少内存消耗,避免因编译过程中的内存需求...
2. 调试:使用Java的`-Djava.compiler=NONE`选项禁用即时编译(JIT),可以使调试更方便。此外,还可以使用专门的JNI调试工具或集成在IDE中的调试功能。 六、实例应用 1. 访问操作系统API:JNI常用于调用操作系统...
2. 调试模式:通过-Djava.compiler=none启动Tomcat,禁用JIT编译以获取更详细的调试信息。 八、集群与负载均衡 1. Tomcat集群:通过复制应用程序和共享Session状态,实现多台Tomcat服务器间的负载均衡。 2. 配合...
此参数指示JVM使用混合模式执行代码,即同时使用解释器和即时编译器(JIT Compiler),以平衡启动速度和运行效率。 2. **-Xint**: 解释模式执行。仅使用解释器执行Java代码,适用于调试和开发环境,牺牲运行效率...
- Java字节码是为Java虚拟机(JVM)设计的,而不是直接针对特定硬件的机器指令集。 - 其他机器代码是特定于硬件的指令集合,用于直接执行在处理器上。 9. **编译器与解释器的区别** - 编译器将源代码一次性转换...
- **高性能**:虽然Java是解释型语言,但通过即时编译器(JIT Compiler)等技术,其执行效率接近于C/C++等编译型语言。 #### 二、Java平台分类 - **Java SE (Standard Edition)**:标准版Java,适用于桌面应用程序和...
为什么Java被称作是“平台无关的编程语言”** - Java虚拟机(JVM)是一个可以执行Java字节码的虚拟机环境。 - Java被称为“平台无关”的原因在于,Java程序在任何安装了JVM的操作系统上都能运行相同的字节码。 30. ...
- **高性能(High performance)**:尽管Java最初被认为是解释性的,但通过即时编译器(JIT Compiler)等技术的优化,其实现了较高的性能。 - **分布式(Distributed)**:Java语言的设计充分考虑了网络应用的需求,...
Java编译器是Java开发中的核心工具,它将程序员编写的源代码(.java文件)转换为可执行的字节码(.class文件),这个过程称为编译。Java的编译器是JDK(Java Development Kit)的一部分,通常被称为javac。在深入...
4. **解释执行**:JVM解释执行字节码,或者通过即时编译器(JIT Compiler)将其转换为机器码执行。 ### 源文件规则 Java源文件遵循以下规则: - **公共类名与文件名相同**:如果源文件包含一个公共类,则该公共类...