A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜佳瑞 中级黑马   /  2012-9-12 11:47  /  1461 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

字节码是javac编译后存在硬盘上得class文件就是字节码了,还是由类加载器加载到内存后才称为字节码呢?网上查了查也是众说纷纭

评分

参与人数 1黑马币 +4 收起 理由
创出一片辉煌 + 4 赞一个!

查看全部评分

5 个回复

倒序浏览
字节码,从名字理解是字节组成的文件,或者说由2进制组成的文件。

class是编译后得到的,不是2进制文件,机器是不能直接执行的。

需要javaVM运行,再这个过程中把class解释成2进制文件,机器才会执行。

所以加载到机器中的class才是字节码。

不过,一般也会把编译好的class直接说成字节码,说的是加载到内存中运行的class。

个人理解,应该是这样吧。
回复 使用道具 举报
回复楼上
我和你的理解一样,我印象中张老师的某个视频中很模糊的阐述了这个观点,他的意思好像就是加载到内存中才称为字节码的。但是网上查的都是认为.class文件就已经是字节码了。
回复 使用道具 举报
本帖最后由 陈振兴 于 2012-9-12 13:45 编辑

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

谢谢你的建议。问题解决了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马