深入分析Java的编译期与运行期】的更多相关文章

不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello world时都经历了哪些流程么? 想通过这篇文章来分析分析Java的执行流程,或者换句话说想聊聊Java的编译期与运行期的流程. 开门见山 编译期间都做了什么 运行期间都做了什么 1. 开门见山 public class MyApp { public static void main(String[] args) { System.out.println("hello world"); } }…
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 转自:http://hi.baidu.com/zhaoyong200518/item/8516dc59a65be1968d12edff c++ 编译期与运行期总结 一 见识编译期的力量 #include "stdafx.h" #include <iostream> using namespace s…
编译期:是指把源码交给编译器编译成计算机可以执行的文件的过程.在Java中也就是把Java代码编成class文件的过程.编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误. 运行期:是把编译后的文件交给计算机执行,直到程序运行结束.所谓运行期就把在磁盘中的代码放到内存中执行起来,在Java中把磁盘中的代码放到内存中就是类加载过程,类加载是运行期的开始部分. 编译期分配内存并不是说在编译期就把程序所需要的空间在内存中分配好,而是说在编译期生成的代…
Scott Meyers在effective modern c++中提到“If there were an award for the most confusing new word in C++11, constexpr would probably win it.” 由此可见,constexpr确实是比较难以让人理解.加之其在C++11和14中的标准略有不同,也加剧了这种难度. 参考几本经典教材(C++ primer, effective modern C++, a tour of C++)…
编译时多态:程序运行前发生的事件 —— 函数重载.运算符重载 .模板  ——静态绑定 运行时多态:程序运行时发生的事件 —— 虚函数机制——动态绑定 template<typename T> void doProcessing(T& w) { T temp(w); temp.go(); }…
Java对象内存存储,引用传递,值传递详细图解 java对象在内存中的分配 编译过程: 编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?回答这个问题需要参照<编译原理>,总结过程如下: )词法分析:读取源代码,一个字节一个字节的读进来,找出这些词法中我们定义的语言关键词如:if.else.while等,识别哪些if是合法的哪些是不合法的.这个步骤就是词法分析过程. 词法分析的结果:就是从源代码中找出了一些规范化的token流,就像人类语言中,给你一句话你要分辨出哪些是一个词语,…
java编译期优化 java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:1.前端编译:把.java文件转变为.class文件2.后端编译:把字节码转变为机器码3.静态提前编译:直接把*.java文件编译成本地机器代码从JDK1.3开始,虚拟机设计团队就把对性能的优化集中到了后端的即时编译中,这样可以让那些不是由Javac产生的Class文件(如JRuby.Groovy等语言的Class文件)也能享受到编译期优化所带来的好处Java中即时编译在运行期的优化过程对于程序运行来…
编译期 静态成员 私有变量 成员变量 运行期 非静态方法 package day1401; public class Test1 { public static void main(String[] args) { B b = new B(); A a = new B(); // 运行期, 并绑定到子类方法 b.p(); a.p(); // 编译期查找 // 编译期根据变量 a 的类型定义, // 在这个类中查找 f()方法并绑定 B.f(); A.f(); /* * 编译期绑定 * */ Sy…
七 晚期(运行期)优化 1 即时编译器(JIT编译器)     ---当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,包括被多次调用的方法和被多次执行的循环体.     ---为了提高热点代码的执行效率,在运行时,虚拟机就会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT编译器).     ---即时编译器不是虚拟机必需的部分,虚拟机规范对其没有做任何规定,与具体的虚拟机实现有关.   2 解释器与编译器  …
在<Java代码的编译与反编译>中,有过关于Java语言的编译和反编译的介绍.我们可以通过javac命令将Java程序的源代码编译成Java字节码,即我们常说的class文件.这是我们通常意义上理解的编译. 但是,字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机器指令,一般要经过以下几个重要步骤: 根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后…
概述 Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler )把字节码转变成机器码的过程 ;还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler ) 直接把*.java 文件编译成本地机器代码的过程.下面列举了这3类编译过程中一些比较有代表性的编译器.…
正文 Java 语言的 3 类编译器: 前端编译器:把 java 文件 转变成 class 文件.例如:Sun 的 Javac. JIT 编译器(即时编译器):后端运行期编译器,把字节码转变成机器码.例如:HotSpot VM 的 C1.C2 编译器. AOT 编译器(静态提前编译器):直接把 java 文件编译成本地机器代码.例如:GCJ(GNU Compiler for the Java). Java 语言的"编译期"是一段"不确定"的操作过程,它可能是 3 类…
从Sun Javac的代码来看,编译过程大致可以分为3个过程: 解析与填充符号表过程. 插入式注解处理器的注解处理过程. 分析与字节码生成过程. Javac编译动作的入口是com.sun.tools.javac.main.JavaCompiler类,上述3个过程的代码逻辑集中在这个类的compile()和compile2()方法中,整个编译最关键的处理就由图中标注的8个方法来完成,下面我们具体看一下这8个方法实现了什么功能. 解析与填充符号表 解析步骤由上图中的parseFiles()方法(过程…
这节我们来总结一下JVM编译器优化问题. JVM编译器优化 Javac编译器 Javac的源码和调试 解析与填充符号表 注解处理器 语法分析与字节码生成 Java语法糖 泛型和类型擦除 自动装箱.拆箱与遍历循环 条件编译 JVM编译器优化 JVM的编译器可以分为三个编译器: 1.前端编译器:把.java转变为.class的过程.如Sun的Javac.Eclipse JDT中的增量式编译器(ECJ). 2.JIT编译器:把字节码转变为机器码的过程,如HotSpot VM的C1.C2编译器. 3.A…
Java“编译期”是一段“不确定”的操作过程:可能是指一个前端编译器(编译器的前端)把*.java文件转变为*.class文件的过程:可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变为机器码的过程:可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把*.java文件编译成本地机器代码的过程.这三类编译过程中一些比较有代表性的编译器: 前端编译期:Sun的Javac/EclipseJDT中的增量式编译…
JVM的编译器可以分为三个编译器: 1.前端编译器:把.java转变为.class的过程.如Sun的Javac.Eclipse JDT中的增量式编译器(ECJ). 2.JIT编译器:把字节码转变为机器码的过程,如HotSpot VM的C1.C2编译器. 3.AOT编译器:静态提前编译器,直接将*.java文件编译本地机器代码的过程. Javac编译器 Javac编译器本身是由Java语言编写的程序. Javac的源码和调试javac的源码存放在JDK_SRC_HOME/langtools/src…
概述 java语言的"编译期"分为前端编译和后端编译两个阶段.前端编译是指把*.java文件转变成*.class文件的过程; 后端编译(JIT, Just In Time Compiler)是指把字节码转变成机器码的过程. 在编译原理中, 将源代码编译成机器码, 主要经过下面几个步骤: Java中的前端编译 java的前端编译(即javac编译)可分为解析与填充符号表.插入式注解处理器的注解处理.分析与字节码生成等三个过程. 解析与填充符号表 解析步骤包括词法分析和语法分析两个阶段.…
Java的编译期优化 因为工作的原因,经常会在没有源码的情况下,对一些产品的代码进行阅读.有时在解决Bug时,在运行环境下会直接去看class文件的字节码,来确定运行中版本是否正确的. 在看字节码时,发现了一个有意思的现象:即便你在代码中使用了定义的常量,反编译后的代码仍会是字符串的字面量. 这个其实就是Java编译器在编译时做了优化,下面就用一个例子来说明一下: public class StringTest { public static final String a1="a";…
1.概述 Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code). 为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler,下文中简称JIT编译器). 2 HotSpot虚拟机内的即时编译器 2.1.解释器和编译器 解释器的优势:快速启动和执…
前言 今日的C++不再是个单纯的"带类的C"语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分.在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态:在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态.在本文中,我们将了解: 什么是运行期多态 什么是编译期多态 它们的优缺点在哪 运行期多态 运行期多态的设计思想要归结到类继…
void adance(std::list<int>::iterator& iter, int d) { if(typeid(std::iterator_traits<std::list<int>::iterator>::iterator_catagory) ]== typeid(std::random_access_iterator_tag)){ iter += d; }else{ ) while(d--)iter++; else while(d++) ite…
1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而已,去rt.jar拿数据干嘛,不依然是class文件,jvm是只要是class文件就能运行. 2.类加载ClassLoader,各个类加载器执行顺序是什么? :永远是自己写的加载器先去加载,记住并不是真正的加载,而是双亲委派机制,每个加载器都不真正去加载,而是去让父加载器去加载,想一下,自然界亦是如…
java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.java文件编译成本地机器代码 从JDK1.3开始,虚拟机设计团队就把对性能的优化集中到了后端的即时编译中,这样可以让那些不是由Javac产生的Class文件(如JRuby.Groovy等语言的Class文件)也能享受到编译期优化所带来的好处 Java中即时编译在运行期的优化过程对于程序运行来说更重要,…
一.满足以下三个条件,一个final变量就不再是一个变量,而是一个直接量. 使用final修饰符修饰. 在申明的时候就进行初始化 初始化的值在编译器就可以确定. 二.在什么情况下初始化的值在编译期是可以确定下来的? 被赋的表达式只是基本的算术表达式或字符串链接运算,没有访问普通变量,调用方法. package fianlFieldCase; public class Test { public static void main(String[] args) { final String str1…
六 早期(编译期)优化   1 “编译期”的含义     · 可能是指一个前端编译器把*.java文件转变成*.class文件的过程,前端编译器如:Sun的Javac.Eclipse JDT中的增量式编译器(ECJ):     · 也可能是指虚拟机的后端运行期编译器(JIT编译器)把字节码转变成机器码的过程,JIT编译器如:HotSpot VM的C1.C2编译器:     · 还可能是指使用静态提前编译器(AOT编译器)直接把*.java文件编译成本地机器码的过程,AOT编译器如:GNU Com…
1.概述 1.1.编译器的分类 前端编译器:Sun的Javac. Eclipse JDT中的增量式编译器(ECJ)[1].  把*.java文件转变成*.class文件 JIT编译器:HotSpot VM的C1. C2编译器.是指虚拟机的后端运行期编译器 ,把字节码转变成机器码 AOT编译器:GNU Compiler for the Java(GCJ)[2]. Excelsior JET[3] .静态提前编译器 ,直接把*.java文件编译成本地机器代码 1.2.编译期优化的方向 虚拟机设计团队…
目录 Java编译期注解处理器 启用注解处理器 遍历语法树 语法树中的源节点 语法树节点的操作 给类增加注解 给类增加import语句 构建一个内部类 使用方法 chainDots方法 总结 Java编译期注解处理器 Java编译期注解处理器,Annotation Processing Tool,简称APT,是Java提供给开发者的用于在编译期对注解进行处理的一系列API,这类API的使用被广泛的用于各种框架,如dubbo,lombok等. Java的注解处理一般分为2种,最常见也是最显式化的就…
1. 代码示例: 上面看到的第13行:  Date  d = null;(这里必须初始化) 第14~20行使用try...catch...finally包含代码,这里的代码已经变成运行期代码.此时我们在编写代码,在编译期,这时候编译器是不能识别这些try...catch...finally包含代码,也就是说:如果上面没有Date d = null(初始化),下面的System.out.println(d)就会报错,因为编译器此时是屏蔽try...catch...finally包含的代码,编译器会…
用Delphi开发程序时,我们可以把遇到的Access Violation分成两大类:运行期和设计期. 一.设计期的Access Violation 1.硬件原因  在启动或关闭Delphi IDE以及编译一个Delphi工程时容易出现设计期的Access Violation.在你的计算机运行中出现 Access Violation信息可能由各种各样的原因引起,包括系统BIOS.操作系统或者是硬件驱动线,有些声卡.显卡.网卡实际上也会导致这种 错误.为什么这么说?计算机里的每一块卡都有它的设备驱…
这一章节的内容实用性不强 所以不再手打笔记 转载了一篇 原文地址是http://blog.csdn.net/qq_27350929/article/details/54837595 在部分的商用虚拟机中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为"热点代码"(Hot Spot Code).为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优…