本帖最后由 陈振兴 于 2012-9-12 13:45 编辑
字节码是javac编译后存在硬盘上得class文件就是字节码了,还是由类加载器加载到内存后才称为字节码呢?
Java虚拟机中有许多附加技术用以提升速度。尤其是与加载器操作有关的,被称为“即时”(JIT)编译技术。就是把程序全部或部分翻译成本地机器码(这本来就是JVM做的事情),程序运行速度因此提高了。就如我们用的保存一样,java会自动做这件事。
当需要装载某个类(为类创建第一个对像)时,你指定好后编译器会先自动找到其.class文件,然后将该类字节码装入内存。这个一般在很复杂的类中会碰到,下面
两种方案:一种就是即时编译所有代码,但这种做法有两个缺陷:这种加载动作散落在整个程序生命周期内,花的时间太多;并且会增加可执行代码的长度(字节码要比即时编译器展开后的本地机器码小很多),降低程序速度。所以你看那些框架的源码时他不会去做单独的字节码加载,他会装载进你想操作的动作当中,执行到这时,自动会调用类加载器来加载字节码!
另一种为“惰性编译”,意思就是即时编译器值在必要的时候才能编译代码。所以就用到了加载器,从不执行的代码也就压根不会被JTI所编译。一般加载器中像hibernate,Spring底层类库就是这样,所以当我们调用时,按照人家API上的说明操作,哪些要类加载,哪些不需要人家已经明文规定了。
这也与反射深深挂钩!尤其是Sping轻量级框架把这个东西用的太牛了!我这个忘得差不多了,就只能说到这一块! |