黑马程序员技术交流社区
标题:
对字节码的理解
[打印本页]
作者:
杜佳瑞
时间:
2012-9-12 11:47
标题:
对字节码的理解
字节码是javac编译后存在硬盘上得class文件就是字节码了,还是由类加载器加载到内存后才称为字节码呢?网上查了查也是众说纷纭
作者:
张 涛
时间:
2012-9-12 11:55
字节码,从名字理解是字节组成的文件,或者说由2进制组成的文件。
class是编译后得到的,不是2进制文件,机器是不能直接执行的。
需要javaVM运行,再这个过程中把class解释成2进制文件,机器才会执行。
所以加载到机器中的class才是字节码。
不过,一般也会把编译好的class直接说成字节码,说的是加载到内存中运行的class。
个人理解,应该是这样吧。
作者:
杜佳瑞
时间:
2012-9-12 12:02
回复楼上
我和你的理解一样,我印象中张老师的某个视频中很模糊的阐述了这个观点,他的意思好像就是加载到内存中才称为字节码的。但是网上查的都是认为.class文件就已经是字节码了。
作者:
陈振兴
时间:
2012-9-12 13:44
本帖最后由 陈振兴 于 2012-9-12 13:45 编辑
字节码是javac编译后存在硬盘上得class文件就是字节码了,还是由类加载器加载到内存后才称为字节码呢?
Java虚拟机中有许多附加技术用以提升速度。尤其是与加载器操作有关的,被称为
“即时”(JIT)
编译技术。就是把程序全部或部分翻译成本地机器码(这本来就是JVM做的事情),程序运行速度因此提高了。就如我们用的保存一样,java会自动做这件事。
当需要装载某个类
(为类创建第一个对像)
时,你指定好后编译器会先自动找到其.class文件,然后将该类字节码装入内存。这个一般在很复杂的类中会碰到,下面
两种方案:一种就是即时编译所有代码,但这种做法有两个缺陷:
这种加载动作散落在整个程序生命周期内
,花的时间太多;并且会增加可执行代码的长度(字节码要比即时编译器展开后的本地机器码小很多),降低程序速度。所以你看那
些框架的源码时他不会去做单独的字节码加载
,他会装载进你想操作的动作当中,执行到这时,自动会调用类加载器来加载字节码!
另一种为“惰性编译”,意思就是即时编译器值在必要的时候才能编译代码。所以就用到了加载器,从不执行的代码也就压根不会被JTI所编译。一般加载器中像hibernate,Spring底层类库就是这样,所以当我们调用时,按照人家API上的说明操作,哪些要类加载,哪些不需要人家已经明文规定了。
这也与反射深深挂钩!尤其是Sping轻量级框架把这个东西用的太牛了!我这个忘得差不多了,就只能说到这一块!
作者:
陈振兴
时间:
2012-9-12 13:54
哦,对了,你应该把那两种框架不仅使用了,而且对于底层的东西明白些了,你在回过头来看加载器与反射这块,你会大有所获的!我现在才复习底层java了,看不了那么快,我看你的技术分都那么多了,基础相对很好了,可以看看哪些……
我觉得你是看到类加载器的委托机制才会提出这个疑问的!
作者:
杜佳瑞
时间:
2012-9-12 15:37
陈振兴 发表于 2012-9-12 13:54
哦,对了,你应该把那两种框架不仅使用了,而且对于底层的东西明白些了,你在回过头来看加载器与反射这块, ...
谢谢你的建议。问题解决了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2