`
水上风荷
  • 浏览: 8871 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类

《深入Java虚拟机》学习笔记一:Java体系结构

    博客分类:
  • Java
阅读更多

前言:从事Java相关的开发工作也有近三年时间了,但是最近不管是在工作和学习中,感觉对很多的问题的理解都还是不够深刻(好像是碰到了所谓的“瓶颈”),所以决定静下心来好好将自己的知识结构梳理一遍,以求获得更大的进步!
      首先想深入研究一下的是JVM。一直很都很想了解一下JVM的具体实现的细节知识,选了一本书《Inside the Java Virtual Machine, Second Edition》,虽然比较旧了,但还算是比较权威的JVM参考书吧?(如果哪位知道有更好的资料,可以推荐给在下,非常感谢!)
第一章:Java体系结构介绍
1、Java为什么重要?

      Java是为网络而设计的,而Java这种适合网络环境的能力又是由其体系结构决定的,可以保证安全健壮和平台无关的程序通过网络传播。
2、网络带来的机遇和挑战
      平台无关性、安全性、网络移动性,Java体系的这三个方面共同使得Java和发展中的网络计算环境相得益彰。
3、Java体系结构
      Java程序设计语言
      Java class文件格式
      Java应用编程接口(API)
      Java 虚拟机 
     【这个其实比较重要,对Java的理解不要仅仅局限于它是一种语言!】
4、Java虚拟机
      Java面向网络的核心就是Java虚拟机,Java虚拟机就是一台抽象的计算机,其规范规定了每个Java虚拟机都必须实现的特性,但是每个特定的实现都有很多选择。而规范本身也很灵活,允许用纯软件的方式来实现,也可以很大部分由硬件来实现。
      Java虚拟机的主要任务是装载class文件并且执行其中的字节码。
      Java有两种方法,Java方法和本地方法,Java方法是有Java语言编写,编译成字节码,存储在class文件中的。本地方法是由其他语言编写的,编译成和处理器相关的机器代码。本地方法保存在动态链接库中,格式是各个平台专有的。Java方法是与平台无关的,但是本地方法却不是。通过本地方法,Java程序可以直接访问底层操作系统的资源。
      Java本地接口(JNI)使本地方法可以在特定主机系统的任何一个Java平台实现上运行。
5、类装载器的体系结构
      类装载器的体系结构是Java虚拟机在完全性和网络移动性上发挥重要作用的一个方面。在Java虚拟机中,存在着多个类装载器。Java虚拟机拥有灵活的类装载器体系结构,从而使Java应用程序得以用自定义的方式来实现类的装载。
一个Java应用程序可以使用两种类装载器:启动(BOOTSTRAP)类装载器和用户定义的类装载器启动类装载器系统唯一,是Java虚拟机实现的一部分。
      每一个类被装载的时候,Java虚拟机都要监视这个类,看它到底是被启动类装载器还是被用户定义类装载器装载。当被装载的类引用了另一个类时,虚拟机就会使用装载第一个类的类装载器装载被引用的类。由于Java虚拟机采取这种方式进行类的装载,所以被装载的类默认情况下只能看到被同一个类装载器装载别的类,通过这种方法,Java体系结构运行一个Java应用程序中建立多个命名空间,运行时的Java程序中的每一个类装载器都有他自己的命名空间。
6、Java Class文件
      为Java程序提供独立于底层主机平台的二进制形式的服务。当编译和链接一个C++程序的时候,所得的可执行二进制文件只能在指定的硬件平台和操作系统上运行,因为这个二进制文件包含了目标处理器的机器语言。而Java编译器把Java源文件的指令翻译成字节码,这种字节码就是Java虚拟机的“机器语言”。
      除了特定处理器的机器语言之外,传统二进制可执行文件的另一个依赖于具体平台的属性石整数的字节顺序。在Java Class文件中字节顺序是高位在前,这与使用何种平台产生这个文件和在何种平台上使用这个文件没有关系。
      除了对于平台无关性的支持,Java Class文件还在支持网络移动性的Java体系结构中担当了至关重要的角色。首先,class文件设计的紧凑,可以快速在网络上传送,其次,由于Java程序师动态链接和动态扩展的,class文件可以在需要的时候才下载。
7、Java API
      JavaAPI 通过支持平台无关性和安全性,使得Java适应于网络应用。
      运行Java程序时,虚拟机装载程序的class文件所使用的JavaAPI class文件,所有被装载的class文件(包括从应用程序中和从JavaAPI中提取的)和所有的已经装载的动态库(包含本地方法)共同组成了在Java虚拟机上运行的整个程序。
      Java API 的class文件天生就与主机平台密切相关,在一个平台能够支持Java程序以前,必须在这个特定平台上明确地实现API功能。对于Java程序而言,无论平台内部如何,JavaAPI都会有同样的表现和可预测的行为,正是由于在每个特定的主机平台上都明确地实现了Java虚拟机和JavaAPI,因此,Java程序自身就能够具有平台无关性的程序。
      JavaAPI在Java安全性模型方面也做出了贡献,当JavaAPI的方法进行任何有潜在危险的操作之前,都会通过查询安全管理器来检验是否得到了授权。安全管理器是一个为应用程序提供自定义安全策略的特殊对象。通过强制执行安全管理器和访问控制器建立的安全策略,JavaAPI促进了安全环境的建立,在这种安全环境中,可以运行具有潜在危险的代码。
8、Java程序设计语言
      Java是一门面向对象的语言,面向对象的技术的承诺之一就是提高代码的重用率,提高开发者的效率,但是这并不意味着Java比c++更有效率。不过和c++相比,Java还是有一些可以提高开发者效率的十分重要的差别,这种效率的提升主要来自于Java对直接内存操作的约束。
      由于Java在运行时强制执行严格的类型规则,根本无法以可能导致内存冲突的方式直接管理内存,因此,Java程序中不会出现那些常使C++程序员降低效率的特定的BUG。
      Java避免无意间破坏内存的另一个办法是自动垃圾收集,Java和c++一样,有一个new操作符,可以通过它来为新对象在堆中分配内存,但是和c++不同的是,Java并没有与new相对应的delete的操作符。垃圾收集器禁止Java程序员显示指明哪个对象应该被释放,当c++项目中的大小和复杂性逐渐上升时,程序员决定哪个对象应该被释放或者判断一个对象是否已经被释放的难度也随之增加。如果不在使用的对象没有被释放,会导致内存泄露;多次释放一个对象会导致内存冲突,这两种内存问题都会导致c++程序崩溃。而c++使用的内存管理方式使得确定问题所在相当困难。Java比c++更有效率的原因在于Java中不用再内存冲突的问题上纠缠不清(开发而非执行上的效率)。而且当不再为显示释放内存担心的时候,效率会更高,程序设计业会更加容易。
      Java在运行时保护内存完整性的第三个办法是数组边界检查,在c++中,数组操作实际上就是指针运算,这会带来潜在的内存冲突。Java中绝对不允许数组操作超出边界,从而导致 内存冲突。
      最后一个关于Java确保程序健壮性的例子是对对象引用的检查,每次使用引用的时候,Java都会确保这些引用不为空值。
9、Java体系结构的代价 
       Java程序的执行速度可能比较低,这是Java面向网络特性上所付出的最主要的代价之一。Java面向网络的体系结构所付出的另一个代价是内存管理和线程调度上的缺陷。垃圾收集器可以使得许多程序更加健壮,这也是网络环境中很有价值的安全性保障措施,但是垃圾收集器也给程序运行时性能加入了一些不确定性,你无法确认垃圾收集器什么时候开始收集垃圾,是否开始收集垃圾,也无法确认垃圾收集到底要持续多长时间。 
       Java为了实现平台无关性,也要付出代价,即最小公分母问题,这是任何尝试提供跨平台功能的API都会出现的固有困难。 
       当把Java Class文件与Java编程语言之间的紧密联系和Java天生的动态链接性联系到一起的时候,还要付出一些代价。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics