`
jeff312
  • 浏览: 76200 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
社区版块
存档分类
最新评论

JVM原理学习笔记(二) —— 虚拟机规范

    博客分类:
  • J2EE
阅读更多
    最近在阅读 《Inside the JVM》 这本书,结合一些日常工作学习中的感想,随便写一些东西,蜻蜓点水,不必有章法。

    曾经很在意C++和Java之间的优劣比较,有一段时间尤其注意在网上搜索二者比较的文章,并不时参加一些口水战,比如下面这个帖子:
http://www.diybl.com/course/3_program/c++/cppsl/2008520/117228.html
在论坛里绝对是个口水飞溅潜力帖。现在想起来很好笑,其实Java跟C++几乎是不同领域的东西,它们之所以存在是因为各自领域的需要,比较一下有助于C++程序员转移到Java去或相反,但优劣之说只能误人子弟。帖子的作者显然不懂虚拟机规范,因此会有所谓“骗局”一说,这里无意驳斥这个作者早已无从考证的老文章,仅就虚拟机规范说几句。

    《Inside the JVM》 一开始就指出,所谓“虚拟机”实际上在不同的语境下有不同的涵义。有时候它指的是虚拟机的“规范”(spec),有时候指的是虚拟机的具体实现(如Sun JDK, BEA JRockit),有时候指的是正在运行着的一个虚拟机的实例(你启动Tomcat或者JBoss,甚至一个j2se程序,都同时启动了一个虚拟机实例)。书中如无特别说明,指的一般都是“规范”。

    虚拟机规范规定了.class文件的格式、类装载的规则、运行时内存的逻辑区块、方法调用时栈的动作等等。一旦某个虚拟机的具体实现(如Open JDK)声称它实现了Java虚拟机规范,那么也就是同时声称它在运行时的外部行为跟规范中所描述的是一样的。对于Java程序员而言,他的“平台”只有一个,就是虚拟机规范,只要他的.class编译完,无论到哪一个虚拟机上,Open JDK也好,JRockit也好,Sun JDK也好,甚至芯片级实现的JVM也好,都应该能够正常运行。这就是Java跨平台的真正涵义(当然,实际项目中,100%的跨平台项目是很少的,比如有些没有完全遵守规范写出的bug,在这个虚拟机上运行的时候或许能糊弄过去,但在另一个虚拟机上却未必能够)。帖子作者认为Java的跨平台是个“设计巧妙的骗局”,实在是言重了,我们不能天真地认为,“跨平台”就可以没有平台,事实上无论怎样我们总需要至少一个的。此外,即使是“跨平台”也是相对的,一个平台因为没有JVM的实现而“跨”不上去,太正常了,世上哪有什么绝对的事。
分享到:
评论
11 楼 lzzy_alex 2012-06-27  
"any problem in computer science can be solved by another layer of indirection"
10 楼 jiangduxi 2009-10-24  
虚拟机(JVM)感觉还得深入学习了解!
9 楼 jeff312 2009-10-23  
凤舞凰扬 写道
jeff312 写道
凤舞凰扬 写道
   一言以蔽之,所谓跨平台是指用java书写的应用程序是跨平台的,而不是指java语言本身的解析执行是跨平台的。


呵呵,愚以为可以更进一步,“Java的可执行文件是跨平台的,一个软件成品,一旦整体完成编译就可以到处运行”。至于语言层面,只要可以用文本编辑器来写代码就或许可算“跨平台”了呢哈。

   呵呵,楼上的前半句表述是有问题的,什么叫可执行文件啊?别被windows的exe文件干扰了的说哦。


从虚拟机规范的角度看,class文件就是可执行文件啊,因为对于虚拟机规范来说,class已经不需要再编译了。至于在具体平台上如windows的JVM可能会把频繁调用的class编译成本地exe,这是虚拟机的实现要关心的问题,对于虚拟机规范而言则是透明的。毕竟,如果某虚拟机是在芯片级别实现的,就根本不会有编译成本地程序这一步了,对于这种虚拟机来说,class就是本地可执行文件。

当然,非要较真的话,class文件显然并不对等于exe,它更像程序连接前的中间产品obj文件。
8 楼 凤舞凰扬 2009-10-23  
jeff312 写道
凤舞凰扬 写道
   一言以蔽之,所谓跨平台是指用java书写的应用程序是跨平台的,而不是指java语言本身的解析执行是跨平台的。


呵呵,愚以为可以更进一步,“Java的可执行文件是跨平台的,一个软件成品,一旦整体完成编译就可以到处运行”。至于语言层面,只要可以用文本编辑器来写代码就或许可算“跨平台”了呢哈。

   呵呵,楼上的前半句表述是有问题的,什么叫可执行文件啊?别被windows的exe文件干扰了的说哦。
7 楼 jeff312 2009-10-23  
凤舞凰扬 写道
   一言以蔽之,所谓跨平台是指用java书写的应用程序是跨平台的,而不是指java语言本身的解析执行是跨平台的。


呵呵,愚以为可以更进一步,“Java的可执行文件是跨平台的,一个软件成品,一旦整体完成编译就可以到处运行”。至于语言层面,只要可以用文本编辑器来写代码就或许可算“跨平台”了呢哈。
6 楼 sun_cat 2009-10-22  
说java的跨平台是做出来的java应用,因为java应用是运行在jvm上的需要jre
所以你要运行java程序那么必须有jre

jvm并不是跨平台的,它有各个版本的实现,这个就不用程序员操心了
5 楼 J-catTeam 2009-10-22  
凤舞凰扬 写道
   一言以蔽之,所谓跨平台是指用java书写的应用程序是跨平台的,而不是指java语言本身的解析执行是跨平台的。

你这句话真的说对了  呵呵 
不同平台 java语言针对的规范有些不一样
4 楼 浪客剑心 2009-10-22  
学习啦!继续啊楼主。
3 楼 凤舞凰扬 2009-10-21  
   一言以蔽之,所谓跨平台是指用java书写的应用程序是跨平台的,而不是指java语言本身的解析执行是跨平台的。
2 楼 whaosoft 2009-10-21  
讲的挺不错的
1 楼 youjianbo_han_87 2009-10-21  
是的,不错

相关推荐

Global site tag (gtag.js) - Google Analytics