java三种编译方式

爱养花的码农      2022-04-07     472

关键词:

  Java程序代码需要编译后才能在虚拟机中运行,编译涉及到非常多的知识层面:编译原理、语言规范、虚拟机规范、本地机器码优化等;了解编译过程有利于了解整个Java运行机制,不仅可以使得我们编写出更优秀的代码,而且还可以使得在JVM调优时更得心应手。

下面我们先来看下Java体系中的三种编译方式:前端编译、即时编译(JIT编译)、静态提前编译(AOT编译),先来了解它们各有什么优点和缺点,再来看看主流的前端编译+JIT编译方式的运作过程。

1、前端编译

       把Java源码文件(.java)编译成Class文件(.class)的过程;

       也即把满足Java语言规范的程序转化为满足JVM规范所要求格式的功能;

优点:

这阶段的优化是指程序编码方面的;

许多Java语法新特性("语法糖":泛型、内部类等等),是靠前端编译器实现的,而不是依赖虚拟机;

编译成的Class文件可以直接给JVM解释器解释执行,省去编译时间,加快启动速度;

缺点:

对代码运行效率几乎没有任何优化措施;

解释执行效率较低,所以需要结合下面的JIT编译;    

前端编译器:Oracle javac、Eclipse JDT中的增量式编译器(ECJ)等;

2、后端编译/即时(JIT)编译

      通过Java虚拟机(JVM)内置的即时编译器(Just In Time Compiler,JIT编译器);在运行时把Class文件字节码编译成本地机器码的过程;            

优点:

通过在运行时收集监控信息,把"热点代码"(Hot Spot Code)编译成与本地平台相关的机器码,并进行各种层次的优化;

可以大大提高执行效率;

缺点:

收集监控信息影响程序运行;

编译过程占用程序运行时间(如使得启动速度变慢);

编译机器码占用内存;

JIT编译器:HotSpot虚拟机的C1、C2编译器等;

 

另外,JIT编译速度及编译结果的优劣,是衡量一个JVM性能的很重要指标;

所以对程序运行性能优化集中到这个阶段;

也就是说可以对这个阶段进行JVM调优;

3、静态提前编译(Ahead Of Time,AOT编译)

       程序运行前,直接把Java源码文件(.java)编译成本地机器码的过程;

优点:

编译不占用运行时间,可以做一些较耗时的优化,并可加快程序启动;

把编译的本地机器码保存磁盘,不占用内存,并可多次使用;

缺点:

因为Java语言的动态性(如反射)带来了额外的复杂性,影响了静态编译代码的质量;

一般静态编译不如JIT编译的质量,这种方式用得比较少;

静态提前编译器(AOT编译器):JAOTC、GCJ、Excelsior JET、ART (Android Runtime)等;

获得类的字节码对象的三种方式(代码片段)

java源码(xxx.java)通过编译后形成字节码文件,字节码文件通过类加载器获得字节码对象,通过字节码对象可以操作源码中的属性和方法。方式一,使用类的class属性: Class<java.util.Date>clazz1=java.util.Date.class; 方式二,... 查看详情

java多线程实现的三种方式

 JAVA多线程实现的三种方式Java中继承thread类与实现Runnable接口的区别 查看详情

java多线程的三种实现方式

今天简单说一下Java三种多线程实现方式和区别,主要有实现Runnable、Callable和继承Thread三种方式。实现Runnable的方式这种方式比较常用,当我们的线程类有继承其他的类的情况下(Java不支持类多继承),并且线程任务不需要返回... 查看详情

intellijidea编译及运行方式介绍

...时编译比较耗费资源,一般都选择手动编译。手动编译有三种类型Compile:对选定的目标(Java类文件),进行强制性编译,不管目标是否是被修改过。Rebuild:对选定的目标(Project),进行强制性编译,不管目标是否是被修改过... 查看详情

qt静态编译时使用openssl有三种方式(不使用,动态使用,静态使用,默认是动态使用)

WhencompilingQtyoucanchooseoneoftheseoptionsbasedontheconfigurecommandline:noOpenSSLsupport(-no-openssl)QtNetworkdynamicallyopeningOpenSSLlibs(-openssl;default)QtNetworklinkingtoOpenSSL(-openssl-linke 查看详情

java中创建线程的三种方式

JAVA中创建线程的三种方式1继承Thread类重写run方法,使用start()开启线程,如此,就可以同时做多件事情publicclassMyThreadextendsThread{@Overridepublicvoidrun(){for(inti=0;i<10;i++){try{sleep(1000);}catch(InterruptedExceptione){e.printStackT 查看详情

spring的依赖注入(di)三种方式

Spring依赖注入(DI)的三种方式,分别为:1. 接口注入2. Setter方法注入3. 构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的。 首先我们需要以下几个类:接口Logic.java接口实现类LogicImpl.ja... 查看详情

java创建线程的三种方式

1.继承Runnable接口packagetest;classRunnableDemoimplementsRunnable{privateThreadt;privateStringthreadName;RunnableDemo(Stringname){threadName=name;System.out.println("Creating"+name);}publicvoidrun(){Syste 查看详情

java-多线程-创建线程的三种方式

JAVA-多线程-创建线程的三种方式并发:同一时间只有一条指令在执行,多个进程的指令被快速轮换执行。并行:同一时间有多条指令在多个处理器上运行。进程:每个运行中的程序就是一个进程。线程:线程(Thread)也被称为轻... 查看详情

java的三种随机数生成方式

...是我们必须要掌握的。而java中产生随机数的方法主要有三种:第一种:newRandom()第二种:Math.random()第三种:currentTimeMillis()第一种需要借助java.util.Random类来产生一个随机数发生器,也是最常用的一种,构造函数有两个,Random()和R... 查看详情

java中创建线程主要有三种方式

Java中创建线程主要有三种方式:一、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程... 查看详情

java多线程开启的三种方式

1、继承Thread类,新建一个当前类对象,并且运行其start()方法1packagecom.xiaostudy.thread;23/**4*@desc第一种开启线程的方式5*@authorxiaostudy6*7*/8publicclassDemo1_ThreadextendsThread{910publicvoidrun(){11for(inti=0;i<10;i++){12Syste 查看详情

java多线程实现的三种方式(代码片段)

...多线程方式三:实现Callable接口方法介绍实现步骤代码演示三种实现方式的对比实现多线程方式一:继承Thread类方法介绍方法名说明voidrun()在线程开启后,此方法将被调用执行v 查看详情

java创建线程的三种方式

http://blog.csdn.net/longshengguoji/article/details/41126119线程的四种创建方式:(1)继承Thread类(2)实现Runnable接口(3)应用程序可通过使用Executor框架来创建线程池(4)实现callable接口线程的几种可用状态(1)新建(2)可运行(3)运... 查看详情

ajpfx关于java多线程实现的三种方式

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承Thread类实现多线程... 查看详情

java反射机制总结(代码片段)

...动态编译的起到了一个关键作用。三.反射获取Class对象的三种方式(获取字节码对象)publicclassReflectDemo1publicstaticvoidmain(String[]args)throwsClassNotFoundException//方式一(通过Class.forName的方式,括号中是包名.类名)常用Classclazz1=Class.forName("xx.... 查看详情

java创建线程的三种主要方式

Java创建线程的主要方式一、继承Thread类创建  通过继承Thread并且重写其run(),run方法中即线程执行任务。创建后的子类通过调用start()方法即可执行线程方法。  通过继承Thread实现的线程类,多个线程间无法共享线程类的实... 查看详情

java定时任务的三种实现方式

...流量,以及备忘录提醒、闹钟等功能。Java系统中主要有三种方式来实现定时任务:Timer和TimerTaskScheduledExecutorService三方框架Quartz 查看详情