精华内容
下载资源
问答
  • jvm分层编译级别

    2021-03-15 16:02:02
    编译级别有:0:解释代码1:简单C1编译代码2:受限的C1编译代码3:完全C1编译代码4:C2编译代码典型的编译日志可以显示,多数方法第一次编译的级别是3,即完全C1编译。(当然,所有方法都从级别0开始。)如果方法运行...

    编译级别有:

    0:解释代码

    1:简单C1编译代码

    2:受限的C1编译代码

    3:完全C1编译代码

    4:C2编译代码

    典型的编译日志可以显示,多数方法第一次编译的级别是3,即完全C1编译。(当然,所有方法都从级别0开始。)如果方法运行得足够频繁,它就会编译成级别4(级别3的代码就会被丢弃)。最常见的情况是:client编译器从获取了代码如何使用的信息进行优化时才开始编译。

    如果server编译器队列满了,就会从server队列中取出方法,以级别2进行编译,在这个级别上,C1编译器使用方法调用计数器和回边计数器(但不需要性能分析的反馈信息)。这使得方法编译得更快,而方法也将在C1编译器收集分析信息之后被编译为级别3,最终当server编译器队列不太忙的时候被编译为级别4。

    另一方面,如果client编译器全忙,原本排程在级别3编译的方法就既可以等待级别3编译,也适合进行级别4的编译。在这种情况下,方法编译会很快转到级别2,然后由级别2转到级别4。

    那些不太重要的方法可以从级别2或级别3开始编译,但随后会因为它们的重要性没那么高而转为级别1。另外,如果server编译器出于某些原因无法编译代码,也会转为级别1。

    当然,代码在逆编译时会转为级别0。

    有些标志可以控制某些级别转换行为,但调优能够得到很乐观的结果。当方法按期望的顺序,即级别0→级别3→级别4编译时,性能可以达到最优。如果方法经常被编译为级别2,并且还额外有可用的CPU周期,那就可以考虑增加编译器的线程数,从而减少server编译器队列的长度。如果没有额外可用的CPU周期,那你唯一能做的就是尽力减小应用的大小。

    展开全文
  • 一、项目编译级别设置菜单栏window->preferences->java->compiler,如下图:修改Compiler compliance level为对应的级别即可。Eclipse对java项目的编译并不是使用JDK完成的,是通过自带的ECJ...

    一、项目编译级别设置

    菜单栏window->preferences->java->compiler,如下图:

    4e1f58202f004eca54b3bc5fa65ec155.png

    62293

    修改Compiler compliance level为对应的级别即可。Eclipse对java项目的编译并不是使用JDK完成的,是通过自带的ECJ(Eclipse

    Compiler for Java)来实现的,这也就解释了为什么你本地安装的JDK或启动Eclipse是在配置文件中通过-vm参数设置的jdk或新建项目时选择的JDK的版本为1.6时,在这里的编译级别却可以选为1.7或1.8的原因,因为所能编译的最高级别跟那些JDK根本没有关系,是由eclipse版本决定的。如果你的Eclipse在这个选项里没有你需要的级别,可以尝试着升级高版本来实现。

    二、运行JRE的设置

    菜单栏window->preferences->java->Installed JREs,

    7fad8f884607d051363d32b3929f6636.png

    62293

    首先在该处添加你需要的JRE,注意此处是添加JRE即可,没有必要是JDK(被选中的JRE为Eclipse默认使用的JRE,即在你新建项目时如不特别指定会默认关联该JRE,在运行该项目时,使用该JRE执行),

    然后在项目的build path中引用JRE即可,如下图:

    62293

    4663c91db0f165d4f933819b5c15053c.png

    这样设置后,Eclipse在run或debug项目时就会使用1.6版本的JRE。

    三、编译与运行版本的关系

    编译的级别可以低于运行JRE的版本,但是不能高于JRE的版本。大概关系如下:

    1、Compiler compliance level =1.6     JRE=1.7

    程序可以正常运行

    2、Compiler compliance level =1.7     JRE=1.6

    程序无法运行,通常会报如下错误

    java.lang.UnsupportedClassVersionError: com/zfc/test/JreTest : Unsupported major.minor version 51.0

    3、Compiler compliance level =1.7     JRE=1.7

    程序可以正常运行

    展开全文
  • 编译语言级别不匹配

    2021-05-27 10:33:29
    有时候编辑器和自己配置的jdk不匹配,会出现报错, java: 错误: 无效的源...可以更换编译语言等级,在file中选择module structura,选中要更换编译语言级别的项目,在language level中更换自己jdk匹配的版本。 ...

    有时候编辑器和自己配置的jdk不匹配,会出现报错,
    java: 错误: 无效的源发行版:16
    可以更换编译语言等级,在file中选择module structura,选中要更换编译语言级别的项目,在language level中更换自己jdk匹配的版本。
    更换编译语言级别

    展开全文
  • java是一个半解释半编译型语言,早期java是通过解释器来执行,效率低下;后期进行优化,解释器在原本的c++字节码解释器基础上,扩充了模板解释器,效率有了明显提升;后来又加入了JIT(即时编译),效率就更加得到了...

    java是一个半解释半编译型语言,早期java是通过解释器来执行,效率低下;后期进行优化,解释器在原本的c++字节码解释器基础上,扩充了模板解释器,效率有了明显提升;后来又加入了JIT(即时编译),效率就更加得到了提升。

    解释器与编译器

    解释器与编译器两者各有优势:当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。当程序发现运行环境中内存资源限制较大,可以使用解释执行节约内存,反之可以使用编译执行来提升效率。同时,解释器还可以作为编译器激进优化时的一个“逃生门”,让编译器根据概率选择一些大多数时候都能提升运行速度的优化手段,当激进优化的假设不成立,如加载了新类后类型继承结构出现变化、出现“罕见陷阱”(Uncommon Trap)时可以通过逆优化(Deoptimization)退回到解释状态继续执行(部分没有解释器的虚拟机中也会采用不进行激进优化的C1编译器担当“逃生门”的角色),因此,在整个虚拟机执行架构中,解释器与编译器经常配合工作如下图所示:

    09c719a8ef62

    img

    利用参数来指定虚拟机处于"解释模式"、"编译模式"还是"混合模式"。

    混合模式:

    java -version

    java version "1.8.0_101"

    Java(TM) SE Runtime Environment (build 1.8.0_101-b13)

    Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

    解释模式:

    java -Xint -version

    java version "1.8.0_101"

    Java(TM) SE Runtime Environment (build 1.8.0_101-b13)

    Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, interpreted mode)

    编译模式:

    java -Xcomp -version

    java version "1.8.0_101"

    Java(TM) SE Runtime Environment (build 1.8.0_101-b13)

    Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, compiled mode)

    解释器

    字节码解释器

    .java->javac->c++代码->硬编码(机器码)

    模板解释器

    .java->javac->硬编码(机器码)

    编译器

    JIT即时编译器

    09c719a8ef62

    图 2. 查看编译模式

    JIT编译器分类

    Client Compiler - C1编译器

    Client:-Client 模式启动时,速度较快,启动之后不如 Server,适合用于桌面等有界面的程序

    Server Compiler - C2编译器

    Server:-Server 模式启动时,速度较慢,但是启动之后,性能更高,适合运行服务器后台程序

    JIT编译过程

    当 JIT 编译启用时(默认是启用的),JVM 读入.class 文件解释后,将其发给 JIT 编译器。JIT 编译器将字节码编译成本机机器代码,下图展示了该过程。

    09c719a8ef62

    JIT 工作原理图

    热点代码(Hot)

    理解

    当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。

    热点代码的分类

    被多次调用的方法

    一个方法被调用得多了,方法体内代码执行的次数自然就多,成为“热点代码”是理所当然的。

    被多次执行的循环体

    一个方法只被调用过一次或少量的几次,但是方法体内部存在循环次数较多的循环体,这样循环体的代码也被重复执行多次,因此这些代码也应该认为是“热点代码”。

    上面提到的多次是一个不具体的词语,那到底是多少次才能成为热点代码呢?

    如何检测热点代码

    判断一段代码是否是热点代码,是否需要触发即使编译,这样的行为称为热点探测,热点探测并不一定知道方法具体被调用了多少次,目前主要的热点探测判定方式有两种:

    基于采样的热点探测:采用这种方法的虚拟机会周期性地检查各个线程的栈顶如果发现某个(或某些)方法经常出现在栈顶,那这个方法就是“热点方法”

    优点:实现简单高效,容易获取方法调用关系(将调用堆栈展开即可)

    缺点:不精确,容易因为因为受到线程阻塞或别的外界因素的影响而扰乱热点探测

    基于计数器的热点探测:采用这种方法的虚拟机会为每个方法(甚至是代码块)建立计数器,统计方法的执行次数,如果次数超过一定的阈值就认为它是“热点方法”

    优点:统计结果精确严谨

    缺点:实现麻烦,需要为每个方法建立并维护计数器,不能直接获取到方法的调用关系

    HotSpot使用第二种 - 基于计数器的热点探测方法。

    确定了检测热点代码的方式,如何计算具体的次数呢?

    计数器的种类(两种共同协作)

    方法调用计数器:这个计数器用于统计方法被调用的次数。默认阈值在 Client 模式下是 1500 次,在 Server 模式下是 10000 次

    回边计数器:统计一个方法中循环体代码执行的次数

    了解了热点代码和计数器有什么用呢?达到计数器的阈值会触发后文讲解的即时编译,也就是说即时编译是需要达到某种条件才会触发的,先写结论,后文讲解什么是即时编译器。

    两个计数器的协作(这里讨论的是方法调用计数器的情况):当一个方法被调用时,会先检查该方法是否存在被 JIT(后文讲解) 编译过的版本,如果存在,则优先使用编译后的本地代码来执行。如果不存在已被编译过的版本,则将此方法的调用计数器加 1,然后判断方法调用计数器与回边计数器之和是否超过方法调用计数器的阈值。如果已经超过阈值,那么将会向即时编译器提交一个该方法的代码编译请求。

    当编译工作完成之后,这个方法的调用入口地址就会被系统自动改成新的,下一次调用该方法时就会使用已编译的版本。

    09c719a8ef62

    image.png

    分层编译

    原因:由于即时编译器编译本地代码需要占用程序运行时间,要编译出优化程度更高的代码,所花费的时间可能越长;而且想要编译出优化程度更高的代码,解释器可能还要替编译器收集性能监控信息,这对解释执行的速度也有所影响,为了在程序启动响应速度与效率之间达到最佳平衡,HotSpot虚拟机将会逐渐启用分层编译,该概念在JDK1.6时期出现,在JDK1.7的Server模式虚拟中作为默认编译策略被开启。

    层次:

    0:解释代码

    1:简单C1编译代码

    2:受限的C1编译代码

    3:完全C1编译代码

    4:C2编译代码

    查看和分析即时编译结果

    一般来说,虚拟机的即时编译过程对用户程序是完全透明的,虚拟机通过解释执行代码还是编译执行代码,对于用户来说没有什么影响(执行结果没有差异,速度上会有很大的差异),大多数情况下用户也没有必要知道,但是虚拟机也提供了一些参数用来输出即时编译行为。

    示例代码:

    public class Test {

    public static final int NUM = 15000;

    public static int doubleValue(int i){

    return i * 2;

    }

    public static long calcSum(){

    long sum = 0;

    for (int i = 1; i <= 100; i++){

    sum += doubleValue(i);

    }

    return sum;

    }

    public static void main(String[] args) {

    for (int i = 0; i < NUM; i++){

    calcSum();

    }

    }

    }

    要知道某个方法是否被编译过,可以使用参数-XX:+PrintCompilation要求虚拟机在即时编译时将被编译成本地代码的方法名称打印出来(带%说明是由回边计数器触发的OSR编译)

    我们还可以加上-XX:+PrintInlining来要求虚拟机输出方法内联信息(备注:-XX:+PrintInlining需要加-XX:+UnlockDiagnosticVMOptions)

    323 102 3 com.yirendai.lab.athenschool.jit.Test::doubleValue (4 bytes)

    323 103 1 com.yirendai.lab.athenschool.jit.Test::doubleValue (4 bytes)

    323 102 3 com.yirendai.lab.athenschool.jit.Test::doubleValue (4 bytes) made not entrant

    323 104 3 com.yirendai.lab.athenschool.jit.Test::calcSum (26 bytes)

    @ 12 com.yirendai.lab.athenschool.jit.Test::doubleValue (4 bytes)

    324 105 % 4 com.yirendai.lab.athenschool.jit.Test::calcSum @ 4 (26 bytes)

    @ 12 com.yirendai.lab.athenschool.jit.Test::doubleValue (4 bytes) inline (hot)

    325 106 4 com.yirendai.lab.athenschool.jit.Test::calcSum (26 bytes)

    @ 12 com.yirendai.lab.athenschool.jit.Test::doubleValue (4 bytes) inline (hot)

    327 104 3 com.yirendai.lab.athenschool.jit.Test::calcSum (26 bytes) made not entrant

    第一列含义为时间戳,第二列中的编号是编译标识,第三列为编译级别

    里面字符的参数含义:

    b Blocking compiler (always set for client)

    * Generating a native wrapper

    % On stack replacement (where the compiled code is running)

    ! Method has exception handlers

    s Method declared as synchronized

    n Method declared as native

    made non entrant compilation was wrong/incomplete, no future callers will use this version

    made zombie code is not in use and ready for GC

    @的含义:

    A “place” in a Java method is defined by its bytecode index (BCI), and

    the place that triggered an OSR compilation is called the “osr_bci”.

    An OSR-compiled nmethod can only be entered from its osr_bci; there

    can be multiple OSR-compiled versions of the same method at the same

    time, as long as their osr_bci differ.

    要理解made not entrant,不得不提codeCache

    public int method(boolean flag) {

    if (flag) {

    return 1;

    } else {

    return 0;

    }

    }

    从解释执行的角度来看,他的执行过程如下:

    09c719a8ef62

    img

    但经过即时编译器编译后的代码不一定是这样,即时编译器在编译前会收集大量的执行信息,例如,如果这段代码之前输入的flag值都为true,那么即时编译器可能会将他变异成下面这样:

    public int method(boolean flag) {

    return 1;

    }

    即下图这样

    09c719a8ef62

    img

    但可能后面不总是flag=true,一旦flag传了false,这个错了,此时编译器就会将他“去优化”,变成编译执行方式,在日志中的表现是made not entrant

    为何 HotSpot 虚拟机要使用解释器与编译器并存的架构?

    解释器与编译器两者各有优势

    解释器:当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。

    编译器:在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。

    两者的协作:在程序运行环境中内存资源限制较大时,可以使用解释执行节约内存,反之可以使用编译执行来提升效率。当通过编译器优化时,发现并没有起到优化作用,,可以通过逆优化退回到解释状态继续执行。

    展开全文
  • 我正在尝试从API级别28(compileSdkVersion 28)的源代码编译.apk.该应用程序编译正常,但安装后崩溃.我的应用在界面本身的各个页面上都有Admob广告.这是我的项目级别的build.gradle-buildscript {repositories {...
  • <build> <...--利用Maven编译插件将编译级别提高至1.8,解决lambda表达式错误--> <groupId>org.apache.maven.plugins</groupId> <!--maven-compiler-plugin是Maven自带.
  • Jenkins 通过maven 构建编译 JAVA 项目环境官网下载合适Jenkins版本包;jenkinsJdkJDK SETomcatMaven二、部署jdk maven tomcat 环境;/etc/profileexport JAVA_HOME=/usr/local/javaexport PATH=$JAVA_HOME/bin:$...
  • 错误A:WARNING: drivers/spi/hi_spi.o(.data+0x0): Section mismatch in reference from the variable hi_spi_platform_driver to the function .init.text:hi_spi_probe()The variable hi_spi_platform_driver ...
  • Linux编译选项

    2021-05-11 16:04:39
    Linux平台都通过CC调用它们的C编译程序.除标准和CC以外,LINUX和FREEBSD还支持gcc.基本的编译命令选项有以下几种:1. -c (compile)编译产生对象文件(*.obj)/目标文件,而不链接成可执行文件,当编译几个独立的模块,而待...
  • linux编译命令大全

    2021-05-10 01:58:24
    linux下编译不同程序用到的命令也是不同,编译程序的命令不在少数,下面由学习啦小编为大家整理了linux编译命令大全的相关知识,希望大家喜欢!linux编译命令大全1.gcc假设源程序文件名为test.c。1. 无选项编译链接...
  • 原标题:宋宝华: 关于Linux编译优化几个必须掌握的姿势01编译选项和内核编译首先我们都知道,Linux内核如果用O0编译,是无法编译过的,Linux的内核编译,要么是O2,要么是Os,这点从Linux的Makefile里面可以看出: ...
  • Python编译相关知识

    2021-02-11 05:32:47
    编译成class -> Jvm解释运行Python:源代码 -> Python解释器解释运行事实上,Python和Java的解释方式是相同的,只是我们表面上看Python是直接解释源代码,而实际上python解释器只会加载字节码。细心的小伙伴...
  • 废话不多说,正文如下: 常用的保护技术 由于Java字节码的抽象级别较高,因此它们较容易被反编译。本节介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大...
  • 两种技术都需要谨慎选择编译的方法以实现最高的性能。对动态编译器而言,编译器自身作出决策,而对于静态编译器,由开发人员作出选择。让 JIT 编译器选择编译的方法是不是优点很难说,取决于编译器在给定情形中推断...
  • Gcc编译

    2021-03-30 11:27:20
    gcc可以编译C、C++、JAVA...等多种语言,且gcc是一个交叉平台编译器,可以再cpu平台上为多种不同体系的硬件平台开发软件 提示:以下是本篇文章正文内容,下面案例可供参考 一、GCC是什么? gcc是一个交叉平台...
  • gcc编译优化,不同参数之间区别
  • 编译c,c++代码安装gcc1、使用如下命令查询 centos 官方gcc的所有包:yum -list gcc*可安装的软件包gcc.x86_64gcc-c++.x86_64gcc-gfortran.x86_64gcc-gnat.x86_64gcc-go.x86_64gcc-objc.x86_64gcc-objc++.x86_64gcc-...
  • GCC编译链接多文件

    2021-05-19 14:31:27
    并且如今也支持C++的编译。与VC不同,gcc是完全跨平台的。到目前为止很多工具都使用gcc作为其编译环境,比如cocos2d-x,android的NDK等等。 学习使用gcc编译器,就是学习它众多的编译参数。就是用连字符-连接的参数....
  • java学习编译原理

    2021-03-05 21:16:49
    在形式化的定义规则里,*号的优先级别高于+号。 5-3-3:java的bnf定义: java的bnf定义 总结:大家可以根据上面的bnf扩展语法,我们发现java的bnf定义如果要声明一个类class_declaration被这样定义: 需要编写一个...
  • 我有一组用API 19和NDK rev 17的独立工具链编译的C/C++库,是否可以在使用API​​ 26(最小SDK目标19)的项目中使用这些库?还是我需要使用API​​ 26重新编译它们?在脚本中,make_standalone_toolchain.py要求提供–...
  • 这完全是定义的问题,对于“编译”的含义,没有单一的公认定义.在你看来,编译正在将某种语言的源代码转换为原生代码;因此,不生成机器代码的转换过程不应称为“编译”.在我的眼里(显然,javac文档编写者的眼睛也是),它...
  • 使用GCC编译程序常用命令

    千次阅读 2021-11-11 09:33:58
    -O3:产生更高级别的优化。 3.4 -I 指定额外的头文件搜索路径 先在指定的路径中搜索要包含的头文件,若找不到,则在标准路径(/usr/include,/usr/lib及当前工作目录)上搜索。 gcc luacallc.c -o luacallc -g -I /...
  • 关注+星标公众号,不错过精彩内容转自 | 技术让梦想更伟大代码的编译速度和代码的质量,可能与多种因素决定,今天给大家分享一下代码编译速度的问题。硬件、编译器造成的使用好点的电脑无疑是一个操...
  • Ceph编译安装教程

    2020-12-20 10:38:51
    Ceph官方版本目前支持的纠删码很有限,实验室这块希望能够整合我们自主开发的纠删码BRS(Binary Reed–Solomon encoding),所以需要编译Ceph环境。Ceph官方目前推荐的安装方式都是通过Ceph-deploy的工具来安装配置,...
  • >bootloader->加载kernel->只读方式挂载root->init->运行系统初始化脚本->默认运行级别->开启或者关闭指定服务->启动终端 升级内核 升级内核可以通过RPM包的方式。那RPM包从哪里来?自己编译或者从网上获取。 这个...
  • linux多文件编译方法

    2021-05-14 14:56:05
    1. 无选项编译链接用法:#gcc test.c作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。2. 选项 -o用法:#gcc test.c -o test作用:将test.c预处理、汇编、编译并链接...
  • 1. 预先编译gcc依赖库:gmp/mpfr/mpc 2. 编译binutils: lyfan@LAPTOP-2TDO37E5:~/share$ tar Jxf binutils-2.32.tar.xz && cd binutils-2.32 && mkdir build && cd build lyfan@LAPTOP-...
  • API 级别是一个对 Android 平台版本提供的框架 API 修订版进行唯一标识的整数值。Android 平台提供了一种框架 API,应用可利用它与底层 Android 系统进行交互。该框架 API 由以下部分组成:一组核心软件包和类一组...
  • 因为工作需要,对ZeroMQ进行简单的研究使用,为了使大家更好、更快的学习使用ZeroMQ,本文将从下载、安装、编译、几方面来对ZeroMQ做个简明的教程总结。(1)到官网下载最新的ZeroMQ安装包:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 299,173
精华内容 119,669
关键字:

编译级别是