Inside the Java Virtual Machinechap01 Javaís Architecture

 

Keyword:

Java platform

The Architecture

Java ís architecture arises out of four distinct but interrelated technologies

  • the Java programming language (source file)
  • the Java class file format (compile to .class file)
  • the Java Application Programming Interface
  • the Java Virtual Machine

the java programming language 源文件,the java class file format

编译成.class 文件,the java virtual machine 运行二进制文件.包括API和程序的

虚拟机和java API 组成了java platform

The Java Virtual Machine

 

java虚拟机就是一个虚拟的计算机.支持3 java 面向网络的特性 : 平台无关系,安全性,网络灵活性

 

虚拟机的主要工作就是加载类,并且执行他们.加载的类有两种,一种是程序的类,另外一种是API

并且当用到特定API的类的时候才进行加载

 

虚拟机的软件实现最简单的就是每次都将byte codes class文件编译成二进制机器码然后执行

另外一种是编译一次,然后将二进制机器码缓存的到内存中.下回就可以直接调用机器码了.

java程序通过引用本地方法同主机进行交互.java中用两种方法,java语言写的方法,编译成

bytecodes 保存在class文件中. 另外一种是用其他语言(C OR assembly) 编写的,通过特别的处理器

编译成二进制机器码. 本地方法按照平台的规范保存在一个动态的连接库中.java语言 编写的方法是

与平台无关系的(因为都是通过compile 编译),但是本地方法却不是.当一个运行的java 程序调用一个

本地的方法的时候,虚拟机加载动态 下图中可以看出本地方法把 java程序和主机连接在一起

 

 

java 给你两种选择,如果你想处理特定平台的资源,而这些资源在 java API 中又没有,你可以

按照平台的规范写java 程序,调用本地方法.如果你想抱持你的程序平台无关性,你必须通过java

API 去调用系统资源.

 

The Class Loader Architecture

在图1.31.4中只有一个方块,代表class loder.在实际中,可能会有多个class loader.

java 的应用可以使用两种 Class Loader:  "primordial"(原始的) class loader

和 class loader objects. The primordial class loader (there is only

one of them) 是java 虚拟机的部分实现

在运行时, java 程序可以安装客户化的class loader object ,例如通过网络下载 class 文件.

java虚拟机认为所有通过primordial class loader 不论他是否是JAVA API 的一部分都是

可信的.所有通过class loader objects, 默认情况下都是不可信的.因为primordial class loader

是虚拟机的内在实现.而 class loader objects 是用java 编写的,编译成 class 文件,和其他对象

一样加载到虚拟机中的对象.1.5

 

 

 

通过 class loader objects, 可以在运行时动态加载java 程序.

每次加载类的时候,不论是通过primordial loader或者 object loader加载类.虚拟机都记载了是由那个加载了这个类.当已经加载的类又引用到了另外一个类的时候.虚拟机通过加载了引用的这个类的class loader加载被引用类

比方说,虚拟机通过某个 class loader 加载了Volcano这个类. 会通过同样的 class loader 加载Volcano引用的

其他类. 如果Volcano 引用了 Lava ,很可能是Lava类中的一个方法,虚拟机会通过引用VolcanoLoad class

引用 Lava.

由于虚拟机是通过这种方式加载类的,所以默认情况下,一个类只能看到通过同样的 Class Loder加载的类.这就是在一个应用程序中可以有多个命名空间.每个class loader 保存自己的和由他加载的类组成的命名空间.

除非应用允许的话,在不同命名空间,通过不同的 Class Loader加载的类 是不能相互处理的.

 

例如:浏览器要通过一个applet class loader -加载applet. Applet 是一个动态加载的例子.程序不知道在什么时候浏览器要加载applet,所有是在运行时决定是否加载.通过不同的 class loader 加载的类是不能够互相访问的

 

The Java Class File

 

 

The Java API

 

java API 是一组动态的连接库,可以在运行时候,调用系统的资源.

 

The Java Programming Language

 

java 语言的一些特性

  • object-orientation
  • multi-threading
  • structured error-handling
  • garbage collection
  • dynamic linking
  • dynamic extension

 

The Java 对内存的使用

首先java 语言是面向对象的. 而面向对象的首要点就是代码可重用性.当就这点而言,java c++比较没有明显

的优势.但是java还能提高生产率.这主要是由于java 是禁止直接进行内存处理的.

 

c++中是可以通过指针直接处理内存的.java 不行.

例如,你有一个Mountain 的引用(c++中的指针类似的东西) ,就只能以Mountain的行为来处理这个类.

如果对Mountain实际上是 Volcano 的引用(火山是山脉的特例) .可以通过类型转换转换成Volcano

 

另外防止内存泄漏的方法是通过自动的垃圾回收来进行的. C++一样java使用 new heap中分配空间.

但和c++不同的是java 没有对应的delete操作符.java 中程序员所做的仅仅是不再继续引用对象了

(使对象失效),垃圾回收会自动释放该对象所占的内存空间.

 

第三点java 保存内存完整性是在运行时检查数组下标的范围

最后一点是检查对象的引用.每次引用对象的时候都保障不是null

 

java语言的一些特性, : 数组下标检查,类安全(type- safe) ,类型转换,检查null 引用,和垃圾回收使java程序

运行起来比相同的c++.

另外,java interpreted的时候也比c++,c++编译成机器码放在可执行文件中,java程序编译成bytes code.

放在class文件中.当运行的时候,虚拟机记载class 文件并且执行里面的byte codes.这样可能会比c++慢上10

 

这样做就就保证了平台无关性.

幸运的是,有一种方法能够提高部分性能,比如 just-in-time ,虚拟机在执行完一次bytecode 编译成机器码后,会在

虚拟机本地缓存,在下次调用的时候重用.

 

执行速度有时候并不是影响用户对应用使用感受的主要原因.有时候,程序要等待网络上面的数据.对与有苛刻的需求

应用,一个即时的编译器也许能够满足客户的需求.

一种就是将class文件运行在一个芯片上面,另外一种就是将程序的一部分,或者所以实现成本地码.

:linux的进程中由于虚拟机是32位的限制,java进程只能分配到4g的内存空间.如果将java 堆设置的过大,就会

影响本地的运行.

 

既兼顾平台无关系,和速度的方法就是在安装的时候,编译.

 

Architectural Tradeoffs

java是面向网络的,也就是这个特性使他要付出一些相应的代价

速度方面和c++ 比较:

转换bytecodes 到机器码要比直接执行机器码慢 10 30

即时编译bytecodes要比转换快78倍但是还是要比本地码慢

java的程序是动态连接的

虚拟机可能要通过网络加载对象

当处理数组的时候有下标检查

所以的对象都是在堆里面创建的

所有的类型转换在运行时都有类型安全的检查

垃圾回收可能效率低

  • java中原类型在每个平台是一致的,c中可以调整
  • 字符串(String)java中是UNICODE当要封装ASCII 时候要效率低些

 

另外一个是对内存管理的失控.自动垃圾回收可以是程序高效.但是增加了不确定性.什么时候进行

垃圾回收.要做多久.这些使java不能应用在即时发生事件上.

另外由于平台无关系,使得java API只能使用系统通用的特性.

 

最后一个折衷的地方是由于java是动态连接的这个特性引起的,一个类文件到另外一个对象的引用是符号性的.

可以使别人很轻易的通过反编译取得你的原代码.

 

Future Trends

hot-spot compiling

程序员应该把调优的工作放在经常用到的10%的代码上面

某种意义上来说,虚拟机将所有的类做即时的编译就像是程序员对所有的代码进行优化一样.

相反的虚拟机有hot-spot 就像是程序员只去优化常用的代码一样,去分析类的执行次数

当识别出热点就即时的编译这个热点.随着程序中热点的转移,虚拟机也不断的去分析,

并且虚拟机也可以回退到编译btedcode.

 

 

利用 hot-spot 编译的方法,虚拟机加载 平台无关系的类文件, 即时编译,并且优化那些最长用到的

代码,并且解释其他的代码.这样的程序可以花80%以上的事件去执行本地码.并且保证不多占用内存

如果这样的话,就和执行本地码的c++程序的执行速度差不多了.

 

还有一个问题由于平台无关系,java只能提供最基本的接口.

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值