有几点不解(我是做C#的,在C#版知道底层的人很少,所以来java版问了,可能问的有些不对)1、编译的机器码是在虚拟机上运行,还是在目标机上运行,我想应该是目标机吧,如果是在虚拟机上运行,那还要编译成不同的机器码干什么呢2、程序在运行的时候,虚拟机除了即时编译,内存管理,垃级回收等工作外,还需要和底层交互吗,也就是真正和机器交互的是虚拟机,还是线程执行的机器码
这两个问题有些雷同,大致我就是想了解“真正和目标机交互的是虚拟机,还是线程执行的机器码”,也就是虚拟机是保姆(即时编译,内存管理,垃级回收等工作),还是程序和机器交互的中介人

解决方案 »

  1.   

    真正执行的是机器码。
    虚拟机负责把字节码通过JIT技术编译成机器码执行。
      

  2.   

    1 java源文件编译后根本就不是不同的机器码,而是与平台无关的字节码
    2 虚拟机有不同平台的实现,真正和机器交互的是虚拟机。
      

  3.   

    http://www.cs.ualberta.ca/~amaral/courses/605-jit/jikesIR.ppt
    这有个jikes rvm(一种java虚拟机)将字节码装换成汇编语言的过程说明。
    它采用的完全编译方式,所以最后字节码->汇编语言代码->机器码,执行。
    sun的jdk是采用解释+编译的方式,虚拟机起到两个功能,一个是解释部分代码,一个是把关键的函数编译为机器码执行。
    .net的clr应该是完全编译成机器码执行的。
      

  4.   

    字节码是平台无关的,jvm生成的机器码是平台相关的。
    C# 的可能理解起来更容易一些,有兴趣的话可以参考http://www.cnblogs.com/JeffreyZhao/上的几篇关于IL和汇编的文章,说的很透彻。