浅谈java virtual machine
java virtual machine 就是指java虚拟器,以下简称vm.关于vm的概念,最早出自cpu模拟器,众所周知的pc上的游戏机模拟器采用的便是和java vm类似的技术.java source code被编译成byte code后,其实已经是很类似机器代码了,只不过没有真正能运行这类code的cpu而已,于是为了能达到在不同平台上运行的目的,vm的概念被大力推广. 从简单的角度说,vm其实就是把java bytecode 翻译成特定的机器代码, 这和解释型编程语言不同,我们会在下面讲到.
第一代的vm大多采用直接解释的方法,也就是说一句一句地把bytecode翻译成机器代码. 但这里有个缺点,如遇到循环, vm就不得不一次次重复翻译已经被翻译过的代码. 而每一次翻译均需消耗一定的cpu时间. 于是出现了第二代的vm – jit (just in time compiler)它只在bytecode需要被翻译时才做翻译工作.怎么实现呢? 打个比方,jit vm可以事先把一段bytecode翻成machine code,并把这段code放进buffer, 当运行循环是,就反复调用这段翻译好的代码! jit的效率取决于他分析重复调用的本领,把翻译的工作量限制到最小,以便让出cpu时间来运行程序逻辑.
第三代的vm叫hotspot,我们以后做介绍.
有了vm以后等于有了一个虚拟的cpu, 但我们还需要一定的外部设备来帮助完成计算任务,于是出现了jni, 它的作用在不同的场合有不同的含义. 有时你可一用jni直接写一个设备驱动程序, 有时jni可被作为lightweight wrapper来封装本地系统的资源.再加上java本身提供的标准库, vm提供了再多平台应用的环境!在一个系统中jvm往往不是唯一的, 如果你在win32中安装了jdk,ie和netscape,哪很有可能你已经有了三种不同的virtual machine. 至于你的程序在那个vm上运行,完全取决于你系统的设置. 大体上如果是运行applet,那么browser的vm会成为默认的平台. 当然你可以用jdk的plug-in取代ie的ms jvm.
每台win32系统都包含了一个ms implement的vm,如果安装了java sdk哪你就可以用jview来从command line启动vm process. 你可以在一台电脑上同时运行几个同种或不同种的vm, 每一个都会运行在独立process中.
下面是一些系统的属性,你可以从中获得关于vm的一些讯息!
用 system.getproperty(string propertyname)
properyname: 含义:
—————————————————–
java.version – jre version
java.vendor – jre vendor
java.vendor.url – vendor url
java.home – installation directory
java.vm.specification.version – jvm 标准的版本
java.vm.specification.vendor – jvm 标准的开发商
java.vm.specification.name –
java.vm.version – jvmachine implementation version:
java.vm.vendor – jvm implementation vendor
java.vm.name – jvm implementation name
java.specification.version – jre specification version
java.specification.vendor – jre specification vendor
java.specification.name – jre specification name:
java.class.version – class format version number:
java.class.path – java classpath