JVM入门研究以及实践.docxVIP

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JVM入门研究以及实践

我们看中的并非Java语言,而是JVM。——Java之父James Gosling接受著名IT网站eWEEK高级编辑的采访时如是说Java之所以能够崛起,JVM功不可没。Java虚拟机最初服务于让Java语言凌驾于平台之上,实现“一次编写,到处运行”;而随着时间的推移,JVM经过不同公司和团体以不同方式的实现(如IBM的J9、 BEA公司的JRockit,本文档主要介绍SUN官方的虚拟机HotSpot),逐渐有更多Java以外的语言登上了JVM这条船,如Groovy、JRuby、Scala、Jython等,而且本人经常会去中关村图书大厦“溜达”,发现被人们一致看好的Scala相关的书越来越多,也许Scala真的会有不错的明天。这里不对以上编程语言加以置评,旨在于对JVM的介绍。初识JVM体系结构Java虚拟机之所以被称之为是“虚拟的”,就是因为它仅仅是由一个规范来定义的抽象计算机,因此要运行某个Java程序,必须需要一个符合该规范的具体实现。我们经常听说Java虚拟机,其实这只是侠义上的理解。JVM可能指的是以下三种不同的概念:虚拟机规范一个具体实现一个运行中的虚拟机实例如图是Sun HotSpot的虚拟机实现的体系结构,它分为类装载子系统、运行时数据区、执行引擎以及本地方法接口,接下来一一介绍。类装载子系统装载器把一个类装入JVM中要要经过三个步骤来完成装载:查找和装入类或接口的二进制数据。连接:执行以下三步,其中解析是可选的验证:检验装入类或接口的二进制数据的正确性。准备:为静态变量分配存储空间。解析:将常量池内的符号引用替换为直接引用。初始化:激活类的静态变量和静态Java代码块。JVM内置了三个默认的装载器:BootstrapLoaderBootstrapLoader是由C/C++实现,我们无法在程序中获取它的实例,这个装载器负责装载lib目录下的dt.jar、tools.jar等Java核心核心类库。ExtClassLoader这个装载器负责装载jdk/lib/ext目录下的jar包。AppClassLoader这个装载器主要负责装载classpath目录下的类。这三个装载器存在层级关系:ExtClassloader为AppClassLoader的父装载器,BootstrapLoader为ExtClassLoader的父装载器。类的装载遵循“双亲委派”模式,如果AppClassLoader被请求装载一个类,它首先会去询问ExtClassLoader是否已经装载,如果已经装载,则返回其对象;如果尚未装载,会继续询问BootstrapLoader,也就是说BootstrapLoader拥有最高的优先级。为了进一步探索JVM的classloader机制,写了如下两个Demo:e.g 1/*****@authorJoher**/publicclass ClassLoaderTest {/***@paramargs*/publicstaticvoid main(String[] args) {ClassLoader loader = Thread.currentThread().getContextClassLoader();System.out.println(loader);System.out.println(loader.getParent());System.out.println(loader.getParent().getParent());}}结果输出:示例说明我们无法直接获取BootstrapLoader实例。e.g 2package java.lang;/****@authorJoher**/publicclass String {publicstaticvoid main(String[] args) {int a = 1;int b = 2;System.out.println(a + b); }}这个小程序会输出什么?答案是这个小程序根本不能运行!运行其会出现如图:提示说:发生了致命异常,程序将退出。WHY? 如果你够敏感,肯定会注意到次类名比较特殊,这是因为次类名与JVM核心类库的java.lang.String类发生了冲突,JVM会认为此同名的类是“恶意”的,所以导致程序直接退出。好吧,为了能使其运行,把类名改成StringTest,这个肯定没有重复的,再次运行会是什么结果?运行抛出一个安全异常,如图:为寻其因,于是溯源而上,根据错误信息定位到java.lang.ClassLoader类,发现如下代码::/* Determine protection domain, and check that: - not define java.* class,- signer of th

文档评论(0)

178****9325 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档