Java代码从编译到执行

来源:互联网 发布:淘宝折扣群 编辑:程序博客网 时间:2024/05/16 08:02

代码编译: 从源代码转换为机器能够识别的机器语言或者汇编语言,是一个翻译代码的过程
对于Java代码来说,是对于一个java类的编译,利用java编译器(javac.exe)将源码编译成能够被JVM的类加载器加载的.class文件(字节码),字节码不是机器码,是一个中间代码,与平台无关。java编译一个类的时候,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则,直接引用。如果Java编译器在指定目录下找不到依赖类,就会报错。
通常的javac编译器指的是前端编译器,详细过程参考:http://blog.csdn.net/shaozengwei/article/details/38659569。代码经过前端编译之后,需要在JVM上进一步将字节码转化为机器码。
Java的编译器与虚拟机的关系:java的编译需要安装JDK环境,而运行需要安装JRE。虚拟机是可以运行编译之后的字节码的环境。JVM是Java代码的跨平台的基础。
一般的语言,如C,代码的编译是针对平台的,针对某一平台编译之后的字节码不能在其他平台上使用,跨平台需要多次编译。而Java为了实现跨平台性,用JVM屏蔽了具体的与平台有关操作系统信息。JVM有自己的硬件架构:处理器、堆栈、寄存器等等,使得Java代码只需编译成能够在JVM上运行的字节码即可。
JVM负责运行字节码:把每一条需要运行的字节码交给解释器,翻译成机器码,然后由解释器执行。
JVM解释器执行代码的过程包括:加载、校验、执行三部分。
加载:由类装载器(classLoader)完成,不仅装载当前类,而且需要载入当前类的引用类。本地类加载之后处于同一内存中,每一个类有自己的命名空间。
校验:由字节码校验器完成,校验的内容包括操作数栈溢出、非法数据类型转换等等
执行:如果字节码通过校验,将.class转化为机器码开始执行。

有关编译时的知识点:
1、

public class Compiler {    static final int number1 = 5;    static final int number2 = 6;    static int number3 = 5;    static int number4 = 6;    public static void main(String[] args){        int result1 = number1 * number2;//该行在编译阶段执行        int result2 = number3 * number4;//该行在运行时执行        System.out.println(result1);         System.out.println(result2);    }}

final变量是在编译时确定的,可以称之为常量折叠(Constant Folding)

2、泛型是在编译期间确定的
3、方法重载是在编译期间实现的,编译期多态
4、方法重写是在运行期间实现的,运行时多态

JVM在对于内存的分配:
Java本身自带的查看内存占用情况的几个方法:

0 0
原创粉丝点击