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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 燕国庆 高级黑马   /  2012-9-26 11:07  /  1796 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在看视频的时候,突然有些迷惑不知道JVM在执行javac时他都要做哪些工作,执行java是又要执行哪些工作?有些时候总是发蒙,糊涂,想问问朋友们有谁可以解释一下,谢谢!!!最好是能举一个具体的例子!:)

4 个回复

倒序浏览
javac(即javac.exe)将您写好的*.java文件翻译成*.class文件(是java字节码,不是二进制代码)

java(即java.exe)将*.class文件运行-----jvm--------将java字节码(即*.class文件)转换成二进制代码,让计算机操作系统运行

要想在一个操作系统(windows、linux.......)上运行一个java程序,中间必须有一个翻译,这就是jvm存在的意义,(是谁让jvm运行的,当然是java了,即java.exe,就是在运行时jvm才运行)jvm就是将javac编译好的*.class文件(java字节码)翻译成计算机能懂得二进制代码

回复 使用道具 举报
JAVA编译程序(JAVAC.EXE)仅仅是执行将JAVA源程序(*.JAVA)翻译为JVM可执行代码-JAVA字节码,也就是说仅仅是语法检查。java运行程序(java.exe)有jvm中的解释器来执行解释执行过程分三步进行:代码的装入、代码的校验和代码的执行。装入代码的工作由“类装载器”(CLASS LOADER)来完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的所继承的类和被调用的类,当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其它办法可以相互影响。在本
地计算机的所有类都在同一地址空间内,而所有从外部引进的类,都有自己独立的一个名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们和外部引进的类不会相互影响。当装入运行程序需要的所有类后,解释器便可以确定整个可执行程序的内存布局,解释器为符号引用与特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,JAVA很好的解决了由超类改变
而使子类崩溃的问题,同时也防止了代码对地址的非法访问。
随后,被装入的代码由字节码校验器进行检查。检验器可发现操作数栈溢出、非法数据类型转化等多种错误。通过校验后,代码便开始执行了。
回复 使用道具 举报
看老张写的就业教程,很详细,摘要一段给你吧。总结一下:javac.exe就管语法是否有错,有错报错,没错就编译成.class文件。java.exe管运行,运行时通过jvm中解释器来做的,解释器做这个事情分三步:类加载器装入代码、解释器确定内存布局并建议对应的内存空间隐射关系表,字节码校验器验证代码是否争取。


这个只是没必要深入下去,一般了解就可以了,因为我们是java的使用者,至于jvm的工作原理,应该是jvm开发者需要深入研究的东西。至少目前我认为学习的目的是学会用java来完成boss给出工作,拿到高薪。哈哈,继续努力!
回复 使用道具 举报
哦了,谢谢大家的解释,有了初步的了解,加油!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马