- 浏览: 899432 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (319)
- Thinking / 反思 (27)
- 我读的技术类图书 (3)
- 我读的非技术图书 (3)
- Java & Groovy (55)
- Ruby/Rails (9)
- Python (10)
- C/C++ (14)
- C# & .net (9)
- 互联网相关技术 (6)
- Database (6)
- Unix/Linux (6)
- WindowsDev (21)
- 工具使用 / Tips (62)
- 编程技术杂谈/咨讯 (6)
- 软工 / 敏捷 / 模式 (6)
- 易筋经 / 各种内功 (3)
- 充电 / 他学科知识 (6)
- 外语学习 (16)
- 我和宝宝的甜蜜生活 (24)
- 八卦 (3)
- 健康 (0)
- 无类别 (0)
- mTogether (4)
- 一页纸 (3)
- SAP (7)
- baby (2)
- abap (2)
- temp (1)
- network (1)
- 生活 (1)
最新评论
-
daliang1215:
收藏一下,好东西。 xp 的快捷键用的非常爽,到win7缺没有 ...
Windows7: 右键任务栏上的一个窗口, 用快捷键c关闭它 -
Alice南京:
感谢
Java GC 监视方法与工具 -
wjason:
今天在excel 2010上面写了一些代码,果然lookup有 ...
Excel 公式: 根据一个单元格的用户输入值, 自动设置另一个单元格的值 -
wjason:
因式分解:http://zh.wikipedia.org/wi ...
教孩子学编程: 数学题1 -
bbls:
不错 找了好久了
VS2010: 在Solution Explorer中,自动关联当前正在编辑的文件
2005-09-17 23:50 作者: 曹晓刚 出处: 程序员 责任编辑:方舟
Java虚拟机的起源与构造
当我们说到“Java”这个词的时候,指的是四个相互关联的概念:Java语言、Java API、Java
Class文件格式、Java虚拟机。整个Java体系是基于Java
虚拟机构造的,正因为如此,才能实现Java的安全性和网络移动性。Java并非是第一个采用“虚拟机”概念的体系,但却是第一个得到广泛运用的虚拟机平
台。 “虚拟”,是一种隔离物理资源与逻辑资源的手段。Java虚拟机的“虚拟”,则是用来隔离物理机器、底层操作系统与Java语言规范实现的手段。
虽然Java是一种面向对象的语言,我们平时大量使用的,是对象间的多态、组合(Composition)、委派(Delegation),但当我们
讨论虚拟机的时候,我们看见的基本概念却是“栈(Stack)”和“堆(Heap)”。根据冯诺依曼的“存储计算”模型,所有的代码都保存在代码空间中,
随着程序计数器指针的变化进行程序的执行、跳转。Java虚拟机中没有寄存器的概念,方法调用是采用“栈”进行的,这是一种安全、简洁的方法。
Java虚拟机通过类装载器支持对类的隔离,这也是Java实现安全性的基础。每个类都具有自己的命名空间,在具有不同安全级别的沙箱中运行,因此不
会产生低安全级别的代码来越权访问高级别代码的机会。类装载器的出现是Java虚拟机与大部分用C实现的虚拟机的显著不同之处。
Java虚拟机的另外一个显著特点就是实现了自动的垃圾收集。在往常,写程序的时候要牢记对象之间的关联,在每个程序块中假若申请了对象空间,就必须
在出口释放掉,方法调用往往同时也就是对象的边界。而自动垃圾收集带给开发者的最大好处,就是可以非常方便地从整体上把系统的对象组织成一张对象图,只需
往这张图中添加对象,维护对象之间的关联,却不需要自己做复杂的清扫工作。正是有了这种思维单纯的对象图的支持,OR
Mapping(关系数据库与对象映射)技术在最近得以大行其道,设计模式也更容易被Java群体所接受。
虚拟机的优化
1995年第一代的Java出台之时,其虚拟机执行是依靠“字节码解释器(Byte Code
Interceptor)”的,也就是说每条指令都由虚拟机来当场解释执行,这造成速度令人抓狂地缓慢。更有甚者有人开始总结许多的“速度优化经验”,比
如说:“尽量把所有的代码都放在较大的方法中执行”与“少用接口”等等,这完全与Java语言的设计目的背道而驰,现在看起来是多么可笑的奇谈怪论,当时
却是很多程序员津津乐道的经验之谈。无他,Java本身执行太慢了。Java生命的前十分之三就是如此缓慢地渡过的。
于是,Sun的工程师开始拼命想着提高执行速度。JIT静态编译器的出现是在1996年十月,Sun放出了第一个编译器。JIT编译器在每段代码执行
前进行编译,编译的结果为本地静态机器码,执行速度有了质的提高。Symantec公司当时凭借其傲人的JIT编译器,在整个Java界受到热烈的追捧。
在其后的1998年,Java 1.2发布的时候,附带了JIT编译器,从此Java的使用者终于可以抛开上面说的那些奇怪的“速度优化经验”了。
JIT静态编译器虽然可以解决一些问题,但是性能仍然和C/C++有很大的差距。对一段程序而言,一名优秀的程序员是如何来改进运行速度的呢?首先,
他不会傻到把所有的代码都来优化,他会观察、思考到底哪段代码对整体性能影响最大?然后集中精力来优化这一段代码。按照经验,整个程序
10%-20%的代码,会占据
80%-90%的运行时间。用这种方法,在同样的时间、付出同样程度的努力后,这名优秀的程序员使整个程序的性能得到了很大程度的优化。HotSpot引
擎,就是模仿人工的这种方法进行优化的。在程序运行的开始,Java代码仍然解释执行,但HotSpot引擎开始进行采样(Profiling)。
根据采样的结果,决定某段程序是占用较多运行时间的,就认为它是“HotSpot”,它也就是目前程序的瓶颈,
引擎开始启动一个单独的线程进行优化。因为不象原始的
JIT编译器那样无差别的编译所有代码,HotSpot引擎可以集中精力来对HotSpot代码进行深度优化,这样这部分代码执行起来更加迅捷。之前的静
态编译器只能按照预定的策略进行编译优化,而HotSpot引擎的优化是基于采样的结果的,因此这种方法对所有的应用程序都有效。1999年3月27
日,Sun放出了第一个HotSpot引擎。在随后的2000年5月的JDK
1.3中,包含了HotSopt引擎,这也使1.3成了一个具有里程碑意义的发行版本。到这里,Java的十年生命,已经过去了一半。
HotSpot代表的是一种动态编译的技术。对Java这种大量使用委派、组合等面向对象特性的程序来说,动态编译比起静态编译来有显著的优势。比如
Method Inlining。方法的调用是一个很耗时的操作,假若可以把方法调用直接内嵌到调用者的代码中,就可以节省大量的时间,
这被称为“Method
Inlining”。因为涉及到类的重载,静态优化很难确切知道哪些属性、方法被重载,因此很难对method进行合并,只好在方法内部进行静态编译,假
若每个方法都很小,静态优化能起到的作用也就比较小。而动态编译因为可以完全随时掌握类的重载情况,就可以把相关的方法合并进行深度优化。现代的Java
程序,特别是在设计模式教育得到普及之后,大量使用类的继承、委派,形成了很多短小的方法,动态编译的优势就更加明显。
自从出现了HotSpot之后,整个Java界为之一振。
最近的五年,就是继续优化的五年。继续进行优化的方法有几条路,一是研究新的采样算法。因为采样关系到不同的优化策略,会对整体性能有比较大的影响。
二是研究深度优化的方法。三是研究垃圾收集的算法。垃圾收集会带来程序短暂的停顿,这会带来负面的用户体验。于是,如何提高垃圾收集的效率,减少延迟,出
现了五花八门的算法,比如渐进式收集、火车算法等。在多处理器的时候,如何利用多处理器进行并行收集也是研究的一个热点。这方面,BEA的JRocket
走在了前面。
现实生活中的虚拟机
最后,让我们来盘点一下目前市面上可见的各个虚拟机。
首先要提到的,毫无疑问是Sun的虚拟机。作为大众心目中的“官方实现”,Sun拥有最大的用户群,并且拥有“兼容基准”的地位,其他虚拟机都必须要
考虑和Sun虚拟机的兼容性问题。比如
JRocket就会在某些特殊情况下表现出和Sun不同的特性,可能对程序运行有影响。不过Sun也的确没有让广大用户失望,虽然在早期性能比不上
Symantec,后来在1.2 的时候性能又被IBM超越,但Sun一直在努力革新,特别是 1.4.2之后,性能有了长足的进步。虽然JDK
1.5的虚拟机在性能上没有什么提高,但是增强了稳定性,据说修改了8000处bug,真是让人汗流不止。原来我们在1.4.2下面一直在享受这么多
bug啊。
其次是老牌劲旅IBM。IBM的JDK在1.3的时代创下了最好的性能记录,从此树立了高端形象。特别是在其WebSphere产品中得到了很好的评价。其JDK也是最早支持64bit的JDK之一。到了现在,IBM JDK在高端仍然是和BEA可以一拼的。
然后是后起之秀,BEA的JRocket。说到BEA突然在JVM领域一夜之间异军突起,多少让人有些瞠目,不过它采取的战略特别简单:自己没有,索
性花钱买了在此领域深有研究的JRocket,在前面加上BEA的标志就可以了。JRocket瞄准高端服务器市场,在多处理器环境下有不俗的表现。
除此之外,还有几个开放源代码的JVM值得一提。首先就是大名鼎鼎的JikesRVM。说起其大名,大多数人都知道Jikes编译器是
IBM开发的,效率比同等的javac编译器高得多,很多开发者都使用Jikes编译器来取代javac。而JikesRVM则是IBM开源出来的一整套
虚拟机技术,包含了JIT,GC的完整实现,在其网站上也有众多的论文,实在是想要深入研究JVM者的绝佳资源(http://jikesrvm.sourceforge.net
)。
Kaffe是一个老牌的JVM,不过现在已经很少听到了。作者撰写此文时,www.kaffe.org
网站已经没有响应,也不知道现在的情况如何了。
GNU则有两个计划:GCJ和GNU classpath。GNU classpath是一个底层实现,而GCJ是支持java的预编译器。
结束语
时光流转,轰轰烈烈的Java虚拟机性能争论仿佛还在耳边回响,现在新的争论却已经是“Java的性能是否已经超越C/C++”。
Joakim Dahlstedt 是 JRockit 的主要架构设计师之一,他坚持认为,Java绝不是一种速度慢,效率低的语言,JVM
是一个关键的组件,确保了系统的部署与运行和开发一样快速、轻松。特别是在目前开发趋势是采用大量预制的框架时,动态编译有可能比C/C++这样的静态优
化获得更好的性能。
发表评论
-
使用Java调用Mantis提供的webservice, 获得Mantis数据
2012-06-07 14:58 3204写在前面 如果使用Mantis来管理bug, ... -
Java:取得子网掩码
2010-03-17 11:10 5277这个讨论的起因是最近修改的一个bug, 我们的系统管理了一堆 ... -
用netbeans做GUI:SocketException: Malformed reply from SOCKS server
2010-01-07 16:24 8730最近的项目是由一些不同的软件相互协作组成的(是的,就是说这个系 ... -
Java Class Loader
2009-12-28 19:57 1369Java中有三种ClassLoader 1. Boot ... -
文件监视: C# and Java
2009-06-15 14:34 2756最近我们组的Mr.S同学到别的项目组里面支援C#去了, 我也 ... -
Java线程: New他就Start他 (遇见JDK1.4.2_04以前的一个bug)
2009-04-28 09:13 1684我们的系统有OutOfMemory现象, Liu同学最近又发现 ... -
Java: 获得所有线程
2009-03-27 17:13 2142我想在一个时刻查看java中还存在的所有线程, 于是googl ... -
Java GC 监视方法与工具
2009-03-27 15:46 6891项目需要,将gc的监视方法,和gc log的分析工具整理一下, ... -
HttpComponents
2009-02-11 15:56 2770今天要做这样的一件事 ... -
Java documentation in Windows Help format
2009-01-10 17:16 1814.chm格式的java帮助文档查找起来很方便, 常用的库我自己 ... -
SWT Win32 Extension 介绍
2008-10-13 10:52 2709SWT Win32 Extension 这个项目 ... -
Java编码规范
2008-09-26 13:43 1804养成好的编码规范对项目组的好处不用多说~ 我最近在一个维护的项 ... -
Java CSV API
2008-09-24 10:04 7641项目中有一些功能是CSV相关的。新来的一个同事问是用什么写的。 ... -
JFugue - 给我的一个小小的惊喜
2008-09-20 18:32 1386今天看到了这篇博客: 让 Java 轻松乐动起来,使用 JFu ... -
Java "properties文件"编辑器 - eclipse插件
2008-09-16 12:07 2195HomePage: http://propedit.sourc ... -
使用java修改windows注册表
2008-08-06 15:04 4556项目中用到,整理如下: 方法1:利用java.util.p ... -
Eclipse插件开发中如何获得classpath下面的资源
2008-07-21 19:38 3116在我的脑海里面有好几个话题需要记录一下,而正因为好多,我现在已 ... -
cactus eclipse plugin is now unavailable!
2008-07-09 14:28 1448今天要下载个apache cactus的eclipse plu ... -
http://www.groovyland.net/pptshare/
2008-07-09 13:00 1331http://www.groovyland.net/pptsh ... -
Java开源报表制作
2008-07-04 17:16 3069http://www.open-open.com/19.htm ...
相关推荐
1. 《明史》:《明史》是中国古代官方修订的二十四史之一,记载了明朝的兴衰历史,包括皇帝本纪、列传等,是研究明朝历史的重要文献。 2. 太祖:明太祖朱元璋,明朝的开国皇帝,以其智慧和勇猛统一了中国,建立了...
隋朝末年,李世民年仅十八岁,便以智谋和胆识崭露头角。他暗中筹备起义,并以礼贤下士、散财养客的策略,成功聚集了众多支持者,盗贼与侠士皆愿为其效力。在太原起兵后,李渊发动了起义,而李世民也率领部队攻克西河...
高中语文 课外古诗文《宋史 太祖本纪》原文及翻译.doc
"《史记-项羽本纪》中人物语言的特点" 《史记-项羽本纪》中的人物语言特点是本文的研究对象。《史记》作为我国文学史上的经典著作,对人物传记尤其关心。《项羽本纪》作为其中一篇,人物语言的特点悉数展现我国古代...
《夏本纪》检测.doc
《高祖本纪》创新课件.ppt
1. 《黄帝本纪》:《黄帝本纪》是《史记》中的篇章,记载了黄帝的事迹,是中国古代历史的一部分,反映了早期华夏文明的形成和发展。 2. 黄帝:黄帝是中华民族的始祖之一,被认为是公孙氏之子,名为轩辕,因其有土德...
《项羽本纪》是《史记》中的一篇,主要记录了西楚霸王项羽的生平事迹。本文档整理了《项羽本纪》中的文言文词汇多义现象,有助于理解古汉语的丰富性和灵活性。 1. **扛**: - (gang) 双手持物,如“力能扛鼎”,...
《史记》是中国古代著名史学家司马迁所著的一部纪传体通史,其中所载“高祖本纪”详细记录了汉高祖刘邦的生平事迹和治国策略。高祖本纪不仅是史学上的重要文献,也是我们了解汉初政治、军事、经济、文化等各方面历史...
《史记·五帝本纪》是司马迁创作的一部关于中国远古时期五位著名领袖——黄帝、颛顼、帝喾、唐尧、虞舜的历史叙述。这部作品是司马迁在《史记》中对先秦历史的开端部分,也是对"原史时期"的探讨。本纪中所述的五帝...
《项羽本纪》是《史记》中的一个重要篇章,主要记录了西楚霸王项羽的生平事迹。本文档“项羽本纪文言现象.doc”探讨的是该篇中的文言词汇及其多种含义,这对于理解和研究古代汉语词汇演变及古文阅读具有重要意义。 ...
《秦始皇本纪》是司马迁《史记》中的一篇,主要记载了秦始皇嬴政一生的事迹和秦朝初期的历史。这篇文言文检测内容涉及到多个文言词汇、语法结构以及历史背景,下面将对这些知识点进行详细解释。 1. 文言词汇: - ...
《史记·秦始皇本纪》是中国古代历史学家司马迁所著《史记》中的一篇重要篇章,记录了秦朝从建立到衰亡的历史,特别是秦始皇嬴政的生平事迹及其统治时期的政策与影响。这篇读后感主要探讨了秦朝统一六国的原因以及...
10. 成语学习:在文本中,“力能扛鼎”是出自此处的一个成语,表示力气极大。 综上所述,《高中二年级语文项羽本纪教(学)案-苏版.doc》的学习内容涉及《史记》的艺术特点、历史人物评价、文言文学习方法以及通过...
《2019_2020学年高中语文学究天人体贯古今第2课夏本纪学案含解析苏教版选修史记蚜20200502149》便是围绕《夏本纪》的学习材料,旨在引导学生深入探索这一历史阶段,了解其丰富的文化内涵和社会变迁。 夏朝的存在,...
高中语文高祖本纪同步练习 苏教版 选修7.doc
他从一名贫困的农家子弟,通过起义军领袖的身份,最终登基成为皇帝,开创了近三百年的朱明王朝。朱元璋的故事,在《明史·太祖本纪·帝疾大渐》中得到了生动的展现,尤其在他的临终遗诏中,我们能够窥见其深邃的政治...
5. 楚汉之争与汉朝建立:刘邦在楚汉之争中逐渐占据上风,最终在垓下一役中击败项羽,于公元前202年建立了统一的汉朝,开启了中国历史上的一个重要时期。 6. 古代年龄称谓:文中列举了古人用特定词汇来表示年龄,如...
本纪_山西太原星河湾项目广告推广提案_82页.pptx
《史记》是中国最早的纪传体通史,由西汉时期的司马迁编纂,包括8篇“书”、10篇“表”、12篇“本纪”、30篇“世家”和70篇“列传”,共计130篇,对后世历史和文学产生了深远影响,被誉为“史家之绝唱,无韵之《离骚...