Java代码从编译到执行

代码编译: 从源代码转换为机器能够识别的机器语言或者汇编语言,是一个翻译代码的过程
对于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本身自带的查看内存占用情况的几个方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值