日期:2014-05-20  浏览次数:20689 次

求解java虚拟机的工作原理
有几点不解(我是做C#的,在C#版知道底层的人很少,所以来java版问了,可能问的有些不对)

1、编译的机器码是在虚拟机上运行,还是在目标机上运行,我想应该是目标机吧,如果是在虚拟机上运行,那还要编译成不同的机器码干什么呢

2、程序在运行的时候,虚拟机除了即时编译,内存管理,垃级回收等工作外,还需要和底层交互吗,也就是真正和机器交互的是虚拟机,还是线程执行的机器码


这两个问题有些雷同,大致我就是想了解“真正和目标机交互的是虚拟机,还是线程执行的机器码”,也就是虚拟机是保姆(即时编译,内存管理,垃级回收等工作),还是程序和机器交互的中介人

------解决方案--------------------
真正执行的是机器码。
虚拟机负责把字节码通过JIT技术编译成机器码执行。
------解决方案--------------------
1 java源文件编译后根本就不是不同的机器码,而是与平台无关的字节码
2 虚拟机有不同平台的实现,真正和机器交互的是虚拟机。
------解决方案--------------------
http://www.cs.ualberta.ca/~amaral/courses/605-jit/jikesIR.ppt
这有个jikes rvm(一种java虚拟机)将字节码装换成汇编语言的过程说明。
它采用的完全编译方式,所以最后字节码->汇编语言代码->机器码,执行。
sun的jdk是采用解释+编译的方式,虚拟机起到两个功能,一个是解释部分代码,一个是把关键的函数编译为机器码执行。
.net的clr应该是完全编译成机器码执行的。
------解决方案--------------------
探讨
楼上两位意见完全不同啊。。

虚拟机编译成不同的机器码,还是楼上兄弟说的编译成与平台无关的字节码?真正和机器交互的是虚拟机,还是线程执行的机器码

------解决方案--------------------
字节码是平台无关的,jvm生成的机器码是平台相关的。
C# 的可能理解起来更容易一些,有兴趣的话可以参考http://www.cnblogs.com/JeffreyZhao/上的几篇关于IL和汇编的文章,说的很透彻。
------解决方案--------------------
肯定还是要交互的,比如垃圾回收之类的东西还是虚拟机来跟踪的。