jvm的3点不明?
1:Javac编译生成的class文件要通过jvm才可以运行,那么jvm是怎么运行class文件的呢?2:Jvm在运行这个class文件的过程当中,是将class文件直接编译成机器码?还是通过调用Windows平台win32api(加入是Windows平台的jvm),在由这个win32api转换成机器码运行?还有两者都有呢?
3:另外甲骨文控告android侵犯专利,这里到底侵犯了什么专利???难道是jvm中的专利?
--------------------编程问答-------------------- .class之于JVM,就像.exe之于windows --------------------编程问答-------------------- Java是一门解释型语言,.class相当于一种中间码、虚拟机负责解释并执行.class文件,这就是Java跨平台的原因,有了.class文件和jvm,哪里都可以运行,我只知道这些、、、 --------------------编程问答-------------------- JVM在执行字节码的时候需要经过下边的步骤:
由类加载器(Class Loader)负责把类文件加载到Java虚拟机中(.class),在这个过程需要校验该类文件是否符合类文件规范
字节码校验器(Bytecode Verifier)检查该类文件的代码中是否存在着某些非法操作
如果字节码校验器校验通过,就由Java解释器负责把该类文件解释成机器码进行执行
JVM在上边操作过程使用了“沙箱”模型,即把Java程序的代码和数据都限制起来放在一定的内存空间执行,不允许程序访问该内存空间以外的内存。这种访问过程不仅仅是本地的,也可以是远程的,最明显的体验是使用RMI的时候。
JVM是Java平台的核心,为了让编译产生的字节码能够更好的解释和执行,JVM主要分为6个部分【这里只是带过,想要了解JVM整体执行原理的读者可以去参考《Inside JVM》】:
JVM解释器:即这个虚拟机处理字段码的CPU。
JVM指令系统:该系统与计算机很相似,一条指令由操作码和操作数两部分组成。操作码为8位二进制数,主要是为了说明一条指令的功能,操作数可以根据需要而定,JVM有多达256种不同的操作指令。
寄存器:JVM有自己的虚拟寄存器,这样就可以快速地与JVM的解释器进行数据交换。为了功能的需要,JVM设置了4个常用的32位寄存器:pc(程序计数器)、optop(操作数栈顶指针)、frame(当前执行环境指针)和vars(指向当前执行环境中第一个局部变量的指针)。
JVM栈:指令执行时数据和信息存储的场所和控制中心,它提供给JVM解释器运算所需要的信息。
存储区:JVM存储区用于存储编译过后的字节码等信息。
碎片回收区:JVM碎片回收是指将使用过的Java类的具体实例从内存进行回收,这就使得开发人员免去了自己编程控制内存的麻烦和危险。随着JVM的不断升级,其碎片回收的技术和算法也更加合理。JVM 1.4.1版后产生了一种叫分代收集技术,简单来说就是利用对象在程序中生存的时间划分成代,以此为标准进行碎片回收。 --------------------编程问答-------------------- class说白了就是二进制块,从第一个字节开始往后算,每个字节都有其独特含义,jvm通过读取二进制串来解释代码逻辑
至于是否编译成机器码,要看代码和jvm,有些jvm会将“热点代码”编译成本地机器码,以加快执行,就根源来说java是解释执行的语言,jvm--虚拟机,根据名字可知,你可以假想jvm就是一台电脑,如果非要深究物理CPU,那肯定是翻译成CPU指令了,但应该不会调windows的api(个人理解)....
至于侵权嘛,这个就不只是技术了,android现在就是块大蛋糕,如果给你个机会,你想不想上去分一块??哈哈 --------------------编程问答-------------------- 感谢楼上的各位的解答!第二个问题,和第三个问题还不是很明白!
到底jvm是否会调用win32api呢???
android 是否侵犯了jvm的专利,才被告的呢?这个适合技术有关的!
深信,会有人给我满意解答的!
--------------------编程问答-------------------- ClassLoader 负责加载Class --------------------编程问答-------------------- class就是JVM认识的,当初谷歌收购SUN就没这事了 --------------------编程问答-------------------- JVM运行.class文件我觉得好比浏览器运行html文件一样,只不过.class文件经过了非常复杂的编译才生成的。
--------------------编程问答-------------------- 1.2 像楼上说的,你可以把class文件看成是html,jvm就是ie,firefox
编译器把java文件编辑为class文件,jvm来执行class文件
和你手写html文件,ie加载执行html文件道理其实真差不多的说....
java之所以跨平台就是因为他为每个操作系统开发了一套jvm,其他jvm在背后帮你在调用系统底层命令来执行你的class类,至于具体调用的是什么api,这个有兴趣的话可以去翻jvm的源代码,可以看openjvm
3.至于oracle和google...这个比较复杂...原本在sun的时候很多java内容是允许第三方使用的,后来oracle收购了以后,这些东西就变成私有专利了...orz,很多年前微软也和sun打过java专利的官司的,这个其实主要是商业斗争了,和用不用java其实本来也没多大关系... --------------------编程问答--------------------
java 是解释型?那javac 编译源文件 作何解释!
java 即是编译型的也是解释型的!先编译再由jvm解释为机器指令
.class文件 ——>由类加载器(classloader)把class 文件加载进内存——>bytecode verifier(字节码校验)——>机器指令运行程序 --------------------编程问答--------------------
java 之所以是跨平台语言是因为 在所有的 平台下产生的.class文件时相同的故.class又称为与平台无关的字节码文件,而不同的平台下有着不同版本的jvm 而.class文件在jvm中运行得到不同的机器指令
运行效果在不同的平台下是相同的
补充:Java , Java SE