`

java编译过程(转载)

    博客分类:
  • Java
阅读更多
Java编译原理
1、Java编译过程与c/c++编译过程不同
Java编译程序将java源程序编译成jvm可执行代码--java字节码.

Java在编译过程中一般会按照以下过程进行:
(1)JDK根据编译参数encoding确定源代码字符集.如果不指定该参数,系统会根据操作系统的file.encoding参数来获取操作系统编码格式,国内的windows通常都是GBK.
(2)JDK根据上面的字符集信息,将源文件编译成JAVA内部的unicode模式,并将编译后的内容保存到内存中.
(3)JDK将内存保存完好的内存信息写入.class文件,生成最后的二进制文件.

   很多人会发现自己在IDE中配置了源文件字符集为UTF-8(与操作系统默认字符集不同)后,再直接运行javac就会出现错误,这就是因为不加encoding参数的编译过程中会默认使用系统的字符集的。在windows中默认为GBK。IDE中进行编译时,IDE会在编译参数中增加该参数.

  如果你使用ant来进行编译活动,那么请你确认你的源代码的字符集,然后再相应的ant编译任务中,增加encoding参数
这就意味着, 如果你之前的项目采用的是系统默认的字符集(GBK)来编辑你的源代码,那么如果你改用UTF-8,这就意味你需要重新修改ant脚本,重新打包你的产品。


c/c++编译过程:
当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而生成的。因此在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。

Java编译过程:
Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址,这样就有效地保证了java的可移植性和安全性。

2、jvm工作原理
运行jvm字符码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验、和代码的执行。

装入代码的工作由“类装载器classloader”完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被调

用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他类。在本台计算机的所有类都在同一地址空间中,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。

当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用与特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内布局,java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码的非法访问。

随后,被装入的代码由字节码校验器进行检查。校验器可以发现操作数栈溢出、非法数据类型转化等多种错误。通过校验后,代码便开始执行了。

java字节码的执行有两种方式:

1)即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码。

2)解释执行方式:解释器通过每次解释并执行一小段代码来完成java字节码程序的所有操作。
分享到:
评论
1 楼 寒冰lyl 2014-10-18  
 

相关推荐

    通过JavaCompiler进行编译java文件(转载)

    Java Compiler API,即`javax.tools.JavaCompiler`,提供了这样的功能,使得我们可以直接在程序中完成Java源代码的编译过程。本文将深入探讨如何使用JavaCompiler API来编译Java源文件。 首先,`JavaCompiler`是...

    骆昊JAVA面试题全集2018博客文章整理

    文章在CSDN上的访问量超过5万次,并被多个网站和个人以原创形式转载,显示出其广泛的影响。随着Java 8的发布,骆昊继续更新题目,以涵盖新版本带来的变化。他不断整理和改进,结合学生们的面试经验,力求保持内容的...

    Java字节码(.class文件)格式详解((转载)

    这篇详解将深入探讨字节码的结构和组成,帮助理解Java程序在JVM中的执行过程。 首先,`.class`文件是Java编译器将源代码(`.java`文件)编译后的结果。每个`.class`文件对应于一个类或接口,包含了类的定义、方法、...

    java编程语言代码规范(中文)

    - `.class`:Java编译后的字节码文件 ##### 2.2 常用文件名 在项目管理中,有一些文件名非常常见,比如: - `GNUmakefile` 或 `makefile`:通常用于定义项目构建规则。 - `README`:用于概述特定目录的内容。 ##...

    Compiler_mean3tmp.rar

    通过跑parse.java 得到两张表的合集和规约过程。 gui.JtableParse3.java 把上面的两张表合在一起图形化了。 我鼓励你发现我的bug *0*虽然我仔细检察过并没有bug 但你可以发布修复bug的最新版本。注意标明原转载网址...

    Compiler_mean3.rar

    通过跑parse.java 得到两张表的合集和规约过程。 gui.JtableParse3.java 把上面的两张表合在一起图形化了。 我鼓励你发现我的bug *0*虽然我不一定会决定去修改它, 但你可以发布修复bug的最新版本。注意标明原转载...

    Java基础知识及面试题.pdf

    JAVA_HOME 是 jdk 的安装路径,CLASSPATH 是 jvm 转载 class 字节码文件时的搜索路径,PATH 是系统的环境变量、命令的搜索路径。 5. JVM JVM 是一个逻辑的操作系统,它屏蔽了硬件和平台的信息,jvm 能将字节码文件...

    [转载]深入理解JVM

    2. **Java类文件格式**:这是一种字节码文件格式,所有Java程序最终都会被编译为这种格式的文件(`.class`文件),以便能够在Java虚拟机上运行。 3. **Java虚拟机(JVM)**:这是一个抽象的计算机,它为运行Java程序...

    linux 打so库

    这些环境变量指向JDK的安装路径,是编译过程能够成功找到Java工具链的前提。 注意事项与维护 在产品的使用环境和注意事项中,提及了产品的供电电压、运行温度范围、湿度、避免带电插拔以及如何正确维护产品等信息。...

    apache ant教程

    通过阅读提供的"ant教程详解--javac,java,jar,war,delete,copy,mkdir...(转载).doc"文档和"ant.pdf",你可以深入理解这些任务的使用方法和实际应用场景,从而更好地将Ant应用于你的Java项目中。

    IBE-master

    在压缩包子文件的文件名称列表中,虽然没有具体的文件名给出,但通常一个完整的Java项目会包含源代码文件(.java)、编译后的类文件(.class)、配置文件(如XML)、测试文件(JUnit测试)和其他支持文件(如README...

    JNA—JNI终结者(转载)

    2. **动态性**:JNA可以动态加载库,无需重新编译Java代码或生成新的JNI库。 3. **类型映射**:JNA能自动将Java数据类型转换为本地数据类型,减少了手动转换的工作。 4. **内存管理**:JNA负责内存管理,避免了JNI中...

    weblogic 安装转载

    EJB 模块是由一组 EJB 组件组成,它们被一起编译和部署到服务器上。然而,并非所有服务器都支持 EJB,例如 Tomcat,它是一个轻量级的 Web 服务器和Servlet容器,只支持 Servlet 和 JSP,而不包含 EJB 容器。 Apache...

    [转载]hotspot源码(JDK7)

    这个过程涉及类的加载、验证、准备、解析和初始化。 6. **编译优化技术** Hotspot采用多种优化策略,如方法内联、逃逸分析、标量替换等,以提升代码执行效率。例如,逃逸分析可以判断对象是否能被其他线程访问,...

    JSP简明教程:JSP基础(转载)

    JSP引擎在幕后将JSP页面转换成Java源代码,这个过程被称为"编译"。这包括解析JSP标签、Java代码以及静态HTML,并将其转换为一个JavaServlet。当用户请求一个JSP页面时,这个Servlet被执行,动态生成HTML响应。这个...

    javac的词法分析,转载自:百度文库

    **Java编译器 javac 的词法分析** Java编译器`javac`是Java开发不可或缺的一部分,负责将源代码转换成可执行的字节码。在这个过程中,词法分析(也称为扫描或词法分解)是第一步,它是将源代码文本转化为编程语言的...

    [转载]Android学习笔记(四):不使用IDE采用命令行.doc

    在Android开发过程中,有时我们可能需要跳过集成开发环境(IDE),如Android Studio,而选择直接使用命令行工具进行操作。这篇【Android学习笔记(四):不使用IDE采用命令行】介绍了如何在命令行环境下建立项目、...

    arthas命令总结(转载)

    7. `jad`:反编译字节码为Java源代码。 8. `jad2smali`:将字节码反编译为Smali代码。 9. `monitor`:监控方法调用,记录方法的执行时间、参数等。 10. `nc`:网络调试,发送HTTP请求。 11. `ojdbc`:查询Oracle...

    2018青鸟学社纳新笔试题.docx

    4. 介绍Java中带参数方法的使用,强调定义和调用过程,指出参数可以是任意类型,包括基本类型和引用类型,但返回值可以为`void`,表示无返回值。 5. 给出的代码片段展示了条件判断语句`if-else`的使用,以及布尔...

Global site tag (gtag.js) - Google Analytics