《JRockit权威指南:深入理解JVM》试读:前 言
机缘巧合促成了本书的出版。
那时,互联网还没有在世界范围内普及,我们也还只是高中生,经常混迹于同一个BBS,在讨论数学问题的过程中结识了对方,成为了好友,并将这份友情延伸到了生活和合作的软件项目中。后来,我们又共同进入了位于斯德哥尔摩的瑞典皇家理工学院(KTH)学习。
在KTH,我们结识了更多的朋友。在第三学年的数据库系统课程中,我们找到了足够多志同道合的人,准备干点事业。最终,我们决定成立一家名为Appeal Software Solutions(其首字母缩写为A.S.S.,当时看来绝对是一个完美的名字)的咨询公司。我们中有些人是半工半读的,所以预留了部分收入,以便当所有成员毕业后可以使公司步入正轨。我们的长期目标是公司可以开发产品,而不仅仅是做咨询,但当时我们还不知道到底要开发什么。
1997年,由于在Sun公司赞助的大学生竞赛中胜出,Joakim Dahlstedt、Fredrik Stridsman和Mattias Joëlson得以参加当年的JavaOne大会。有意思的是,第二年,他们又胜出了。
一切都源于我们的3位英雄在1997年和1998年参加的两届JavaOne大会。在会上,他们注意到,Sun公司的自适应JVM——HotSpot虽然在当时被誉为能够彻底解决Java性能问题的终极JVM,但在这两年里却没有什么实质性的进步。那时的Java主要是解释执行的,市场上有一些针对Java的静态编译器,可以生成运行速度快于字节码的静态代码,但是这从根本上违反了Java的语义。正如本书反复强调的,到目前为止,自适应解决方案在运行时具有远超静态解决方案的潜力,但实现起来也更困难。
1998年,HotSpot没什么动作,年轻气盛的我们不禁问道:“这很难吗?看我们做一个更好、更快的自适应虚拟机出来!”我们专业背景不错,而且认为有了明确的方向,于是就开工了。尽管后来的实践证明了挑战比我们预期的更大,但我们想提醒读者的是,当时是1998年,Java在服务器端的腾飞才刚刚开始,J2EE刚刚出现,几乎没人听说过JSP。因此,我们所涉及的问题领域小得多。
我们最初计划用一年时间实现一个JVM的预览版,同时继续提供咨询服务来保证JVM的持续开发。最初,新JVM的名字是RockIT,结合了Rock and Roll(摇滚)、Rock Solid(坚如磐石)和IT三者的意思。后来由于注册商标的原因,又在名字前面加了一个字母J。
在经历了初期的几次失败后,我们需要寻找风投。当然,向投资人解释清楚为什么投资一款自适应JVM能够赚钱(同时期的其他竞争对手都是免费提供的),是一大难题。这不仅仅因为当时是1998年,更重要的因素是,投资人还无法理解这种既不需要给用户发广告短信,也不需要发送电子邮件订单的商业模式。
最终,我们获得了风投,并在2000年初发布了JRockit 1.0版本的第一个原型。尽管只是1.0版本(网上有人说它“非常1.0”,不够成熟),但是它应用于多线程服务器程序时性能优异,风光一时。以此为契机,我们获得了更多的投资,并将咨询业务拆分为一个独立的分公司,公司的名字也从Appeal Software Solutions变成了Appeal Virtual Machines。我们又雇用了一些销售人员,并就Java许可证的问题开始与Sun公司协商。
JRockit的相关工作越来越多。2001年,处理咨询业务的工程师都转入了与JVM相关的项目中,咨询公司宣告停业。这时,我们清楚地知道如何将JRockit的性能再提升一步,同时也意识到在这个过程中我们消耗资源的速度太快了。于是,管理层开始寻找合适的大公司,以实现整体收购。
2002年2月,BEA公司收购Appeal Virtual Machines公司,这让投资人松了一口气,同时也保证了我们有足够的资源做进一步的研究和开发。为了配合测试,BEA建立了一个宽敞的服务器机房,加固了地板,保证了电力供应。那时,有一根电缆从街上的接线盒通过服务器机房的窗户连进来。过了一段时间,这个服务器机房已经无法放下开发测试所需的全部服务器了,于是我们又租了一个机房来放置服务器。
作为BEA平台的一部分,JRockit的发展相当理想。在BEA的前两年,我们为JRockit开发了很多区别于其他Java解决方案的新特性,例如后来发展成为JRockit Mission Control的开发框架。此后,新闻发布、世界级的测试跑分和虚拟化平台随之而来。在拥有了JRockit后,BEA与Sun、IBM并列为三大JVM厂商,成为了拥有数千用户的平台。JRockit产生的利润,首先是来自工具套件,然后是产品JRockit Real Time提供的无比强大的GC性能。
2008年,Oracle收购BEA,这一事件起初令人感到不安,但是JRockit和相关团队最终获得了更多的关注和赞誉。
经过这些年的发展,令我们引以为荣的是,JRockit的用户遍布全球,它为关键应用的稳定运行保驾护航。同样令我们感到骄傲的是,当初6个少年在斯德哥尔摩老城区的一个小破屋中的设计已经成长为世界级产品。
本书的内容是我们十多年来与自适应运行时,尤其是JRockit,打交道的经验总结。据我们所知,其中的很多内容之前还没有发表过。
希望本书能对你有所帮助和启发。
内容概述
第1章:起步。这一章对JRockit JVM和JRockit Mission Control做了简要介绍,内容包括如何获得相关软件及软件对各平台的支持情况,在切换JVM厂商的产品时需要注意的问题,JRockit和JRockit Mission Control版本号的命名规则,以及如何获取更多有关JRockit JVM的内容。
第2章:自适应代码生成。这一章对自适应运行时环境中的代码生成做了简要介绍。具体说来,解释了为什么在JVM中实现自适应代码生成比在静态环境中更有难度,而其实现所能发挥的效用却更加强大;介绍了赌博式的性能优化技术;通过一个例子介绍了JRockit的代码生成和优化流水线;讨论了自适应代码优化和传统代码优化;介绍了如何使用标志和指令文件来控制JRockit的代码生成。
第3章:自适应内存管理。这一章对自适应运行时环境中的内存管理做了介绍。通过介绍自动内存管理的相关概念和算法,解释了垃圾回收器的工作机制。详细介绍了JVM在为对象分配内存时所做的具体工作,以及为便于执行垃圾回收所需记录的元数据信息。后半部分主要介绍用于控制内存管理的最重要的Java API,以及可在Java应用程序中生成确定性延迟的JRockit Real Time产品。最后,介绍了如何使用标志来控制JRockit JVM的内存管理系统。
第4章:线程与同步。这一章介绍了Java和JVM中非常重要的线程与同步的概念及其在JVM中的简要实现,并深入讨论了Java内存模型及其内在的复杂性。简单介绍了基于运行时信息反馈的自适应优化对线程和同步机制的实现的影响。此外,还以双检查锁失效为例对多线程编程中常见的一些错误做了介绍。最后讲解了如何分析JRockit中的锁,以及如何通过标志控制线程的部分行为。
第5章:基准测试与性能调优。这一章讨论了基准测试的相关性,以及制定性能目标和指标的重要性;阐释了如何针对特定问题设计适合的基准测试;介绍了一些针对Java的工业级基准测试套件;详细讨论了如何根据基准测试的结果优化应用程序和JVM;以JRockit JVM为介绍了相关命令行参数的使用。
第6章:JRockit Mission Control套件。这一章介绍了JRockit Mission Control工具套件,包括启动和各种详细配置等内容。解释了如何在Eclipse中运行JRockit Mission Control,以及如何配置JRockit以使Eclipse在JRockit上运行。介绍了几种不同的工具,统一了相关术语的使用。讲解了如何使用JRockit Mission Control远程访问JRockit JVM,以及与故障处理相关的内容。
第7章:Management Console。这一章介绍了JRockit Mission Control中的Management Console组件,讲解了诊断命令的概念以及如何在线监控JVM实例,还介绍了触发器规则的设置和事件通知的机制,最后讲解了如何利用自定义组件扩展Management Console。
第8章:JRockit Runtime Analyzer。这一章介绍了JRockit运行时分析器(JRockit Runtime Analyzer,JRA),它是一款可以定制的按需分析框架,用于详细记录JRockit以及运行在其中的应用程序的执行状况,以便进行离线分析。其记录内容包括方法和锁的性能分析、垃圾回收信息、优化决策信息、对象统计信息以及延迟事件等。这一章最后介绍了如何根据这些记录信息来判别常见问题以及如何延迟分析。
第9章:JRockit Flight Recorder。这一章详细介绍了JFR(JRockit Flight Recorder)。新版本JRockit Mission Control套件使用JFR取代了JRA。这一章讲解了JFR与JRA的区别,最后介绍了如何扩展JFR。
第10章:Memory Leak Detector。这一章介绍了JRockit Mission Control套件中的最后一个工具JRockit Memory Leak Detector。其中介绍了具有垃圾回收功能的编程语言中内存泄漏的概念,以及Memory Leak Detector的一些用例。Memory Leak Detector不仅可以用来找出Java应用程序中意外持有的对象,还可以对Java堆做通用分析。此外还介绍了Memory Leak Detector的一些内部实现机制,以及它能保持很低的运行开销的原因。
第11章:JRCMD。这一章介绍了命令行工具JRCMD。用户可以通过JRCMD与目标机器上的JVM交互,并发送诊断命令。这一章按字母表顺序列出了JRCMD中最重要的诊断命令,并通过示例讲解了如何使用这些命令来检测或修改JRockit JVM的状态。
第12章:JRockit Management API。这一章介绍了如何编程实现对JRockit JVM内部功能的访问,如JRockit Mission Control套件就是基于Management API来实现的。尽管这一章介绍的JMAPI和JMXMAPI并未得到完整的官方支持,但从中可以了解到一些JVM的工作机制。希望读者可以实际动手操作一下,以加深理解。
第13章:JRockit Virtual Edition。这一章介绍了现代云环境中的虚拟化,其中包括了JRockit Virtual Edition产品的相关概念和具体细节。通常来说,操作系统很重要,但对于JRockit Virtual Edition来说,移除软件栈中的操作系统层并不是什么大问题,而且移除之后还可以降低操作系统层所带来的性能开销,降低的程度甚至在物理硬件上也达不到。
阅读前提
请正确安装JRockit JVM和运行时环境。为了更好地理解本书的内容,请使用JRockit R28或其之后的版本,不过使用JRockit R27也是可以的。此外,正确安装Eclipse for RCP/Plug-in Developer也很有必要,尤其是尝试用不同的方法扩展JRockit Mission Control以及使用源码包中的程序时。
目标读者
本书主要面向以Java为工作中心,并已具备一定知识技能的人员,例如对Java开发或安装管理有相关工作经验的开发人员或系统管理员。书中内容分为3大部分。
第一部分着重介绍了JVM和自适应运行时的作用及工作原理,还指出了自适应运行时以及JRockit的优势和劣势,以便在适当的时候解释什么是良好的Java编码实践。深入到JVM这个黑盒中,探查运行Java应用程序时到底发生了什么。理解第一部分的内容可以帮助开发人员和架构师理解某些设计决策的后果,进而做出更好的决策。这部分也可作为高校自适应运行时课程的学习资料。
第二部分着重介绍了JRockit Mission Control套件的具体功能,以及如何使用它来查找应用程序的性能瓶颈。对于想要对JRockit系统做性能调优以运行特定程序的系统管理员和开发人员来说,这部分内容非常有用。对于希望优化Java应用程序以提高资源利用率、优化性能的开发人员来说,这部分内容也很有用。但应该记住的是,对JVM层面的调优也只有这么多了,对应用程序本身的业务逻辑和具体实现做调优其实是更简单、更有效的。本书将会介绍如何使用JRockit Mission Control 套件来查找应用程序的瓶颈,以及如何控制硬件和程序运行的成本。
第三部分介绍了新近和即将发布的重要的JRockit相关技术,主要面向对Java技术发展方向比较感兴趣的读者。这部分内容着重讲解了Java虚拟化。
最后,列出了本书的参考文献和术语表。
排版约定
本书中会包含一些代码,包括Java代码、命令行和伪代码等。Java代码以等宽字体表示,并按照标准Java格式显示。命令行和参数也会以等宽字体显示。类似地,段落中引用的文件名、代码片段和Java包名也会使用等宽字体表示。
与正文相关的重要一些信息,或是补充说明,会使用中括号括起来。
此部分内容很重要!
技术名词和基本概念会作为关键字用黑体字表示。为便于查询,这些技术名词会列在术语表中。
在本书中,JROCKIT_HOME和JAVA_HOME表示JRockit JDK/JRE的安装目录。例如,默认安装JRockit之后,Java命令的位置是:
C:\jrockits\jrockit-jdk1.5.0_17\bin\java.exe
而JROCKIT_HOME和JAVA_HOME的值则为:
C:\jrockits\jrockit-jdk1.5.0_17\
JRockit JVM有其自己的版本号规则,目前最新的主版本是R28。JRockit的次版本号表示在发行主版本后第几次发行小版本,例如R27.1和R27.2。本书中使用R27.x表示所有的R27版本,R28.x表示所有的R28版本。
默认情况下,本书所介绍的内容是以R28版本为基础的,针对之前版本的内容会特别说明。
JRockit Mission Control客户端使用了更加标准的版本号规则,例如4.0。在介绍JRockit Mission Control的相关工具时,工具的版本号3.x和4.0也分别对应了JRockit Mission Control客户端的版本。在写作本书时,JRockit Mission Control客户端的最新版本是4.0,除非特别指明,所有内容均是以此版本为基础来讲解的。
书中内容有时会涉及一些第三方产品。阅读本书时无须十分了解这些产品。涉及的第三方产品如下。
Oracle WebLogic Server:Oracle J2EE应用服务器
Oracle Coherence:Oracle内存型分布式缓存技术
Oracle Enterprise Manager:Oracle应用程序管理套件
Eclipse:Java IDE(也可用于其他语言的开发)
HotSpotTM:HotSpotTMJVM
读者反馈
欢迎读者反馈对本书的看法,喜欢什么、不喜欢什么,这对我们开发读者真正需要的选题来说非常重要。
要发送反馈信息,可以直接发邮件到feedback@packtpub.com,并在邮件主题中注明书名。
如果你需要某本书,希望我们出版的话,请在PacktPub的官网www.packtpub.com中填写表单,或者发邮件到suggest@packtpub.com来说明。
如果读者精通某个领域,并且想要撰写或参与写作一本书的话,请阅读www.packtpub.com/authors中的作者指南。
客户支持
针对购买了Packt图书的读者,我们提供了很多周边内容,帮助你更好地理解书中内容。
下载本书示例代码
可从http://www.ituring.com.cn/book/2491下载本书中的示例代码,以及代码的使用说明。
勘误
尽管我们尽力确保书中内容无误,但错误在所难免。如果读者发现了错误,不管是文字错误还是代码错误,敬请告知,我们将感激不尽。这不仅可使其他读者免受错误困扰,还可以帮助我们完善本书后续的版本。如果读者发现了任何错误,请访问http://www.packtpub.com/support,选择书名,然后点击let us know链接,输入勘误的具体内容。 当勘误通过验证后,内容将被接受,而且该勘误信息将上传到我们的网站,或者添加到该书下面Errata部分的已有勘误表列表当中。在http://www.packtpub.com/support可以看到目前已有的勘误表。
盗版问题
对所有媒体来说,互联网盗版都是一个长期存在的问题。Packt公司对自己的版权和许可证的保护非常严格。如果你在互联网上遇到以任何形式非法复制我们作品的行为,请立刻向我们提供具体地址或网站名称,以帮助我们采取补救措施。
请通过copyright@packtpub.com联系我们,并且附上可疑盗版资料的链接。
感谢你帮助我们保护作者,使我们能够带给你更有价值的内容。
疑问
如果读者对本书有任何疑问,请发邮件至questions@packtpub.com说明,我们会尽力解决。
致谢
感谢这些年一直陪伴在我们身边的富有创造力的人们。特别是Appeal的同事,你们已经成为我们生活的一部分,我们很荣幸能与如此卓越的团队分享这段历程。
此外,非常感谢我们的家人,感谢你们在本书写作期间给予我们的耐心和支持。
电子书
扫描如下二维码,即可购买本书电子版。
作者: [瑞士] 马库斯·希尔特, [瑞典]马库斯·拉杰格伦
isbn: 7115500452
书名: JRockit权威指南:深入理解JVM
页数: 336
译者: 曹旭东
定价: 99.00元
出版社: 人民邮电出版社
出版年: 2019-1
装帧: 平装