`

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();
分享到:
评论

相关推荐

    Ja-netfiter-2022.2.0 主要更新对 jdk 17的兼容

    jdk 17需要 新增 配置 如下 jvm参数 --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED

    java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7-8.aarch64.tar.gz

    基于arm64架构CentOS 7.9.2009 (AltArch)版本系统 ...打包/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.aarch64 openEuler 20.04 LTS安装GConf2-devel后,可启动apache-tomcat-8.5.91

    jolokia-jvm-agent-1.6.2-3.el8.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    kotlinx-coroutines-io-jvm-0.1.1.jar

    kotlinx-coroutines-io-jvm-0.1.1.jar

    metrics-jvm-3.1.5-API文档-中文版.zip

    赠送jar包:metrics-jvm-3.1.5.jar; 赠送原API文档:metrics-jvm-3.1.5-javadoc.jar; 赠送源代码:metrics-jvm-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-jvm-3.1.5.pom; 包含翻译后的API文档:...

    kotlin-compiler-embeddable-1.4.21.jar

    kotlin gradle build project所需要的jar包

    windows64 hsdis-amd64.dll

    jvm开启-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly 需要hsdis-amd64.dll支持才能输出汇编代码,这是编译好的dll,用于windows64位,java9需要放到bin/server中,java8放到jre/bin/server

    JDK8版本jdk-8u202-linux-x64.tar(gz).zip

    jdk-8u202-linux-x64.tar.gz,Oracle-jdk8,JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

    MemoryAnalyzer-1.12.0.20210602-win32.win32.x86-64.zip

    资源名称:Eclipse Memory...Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。 这个版本是支持jdk11的,上一个1.11的版本是jdk1.8的。收大家分就是因为下载比较难搞。

    nginx-upstream-jvm-route-1.12.0.tar.gz

    nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。 安装方法(进入Nginx源码目录): #patch -p0 < /path/to/this/directory/jvm_route.patch # ./configure -...

    MemoryAnalyzer-1.10.0.20200225-win32.win32.x86_64.zip

    通过jmap 导出文件,对jvm...JVM 内存分析软件,查看jvm 内存是否泄漏,那个class 内存泄漏,通过java 命令 jmap -dump:live,format=b,file=${文件路径}/xxx.bin 进程ID 导出bin 文件,用该软件进行对bin文件进行分析

    Cpp运行Java的class文件.zip

    Cpp运行Java的class文件,可以编译... options[0].optionString = "-Djava.class.path=./"; args.options = options; args.ignoreUnrecognized = JNI_FALSE; return JNI_CreateJavaVM(jvm, (void **)env, &args); }

    ant-eclipse-jvm1.2-1.0.jar.zip

    标签:ant-eclipse-jvm1.2-1.0.jar.zip,ant,eclipse,jvm1.2,1.0,jar.zip包下载,依赖包

    JAVA命令大全-JVM设置.rar

    JAVA命令大全-JVM设置.rar JAVA命令大全-JVM设置.rar

    面试总结-JVM .png

    JVM 的运行机制 多线程 JVM 的内存区域 JVM 会创建操作系统的接口创建一个原生线程。JVM 线程和操作系统线程是一一对应的

    kafka_2.9.2-0.8.2.1.tgz

    KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseCompressedOops -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt....

    JDK7版本jdk-7u80-linux-x64.tar(gz).zip

    jdk-7u80-linux-x64.tar.gz,Oracle-jdk7,JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

    jre-8u221-windows-x64.exe

    JRE为Java Runtime Environment的简称,Java Runtime Environment(包括Java Plug-in)是Sun的产品,包括两部分:Java Runtime Environment和Java Plug-in。JavaRuntimeEnvironment(JRE)是可以在其上运行、测试和...

    nginx-upstream-jvm-route-0.1.tar.gz

    nginx-upstream-jvm-route-0.1.tar.gz 用来实现Nginx Tomcat 集群session复制的问题!

    jruby-dist-9.1.15.0-bin.tar.gz

    JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。 截至2017.12.08最新稳定版 JRuby 官方更新说明: JRuby 9.1.x is our current ...

Global site tag (gtag.js) - Google Analytics