`
ylsun1113
  • 浏览: 28389 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

深入JAVA虚拟机读书笔记

    博客分类:
  • jvm
 
阅读更多

深入java虚拟机读书笔记


第一章 java体系结构介绍


1.1为什么使用java
环境的需要。由于逐渐通过网络连接起来的智能设备和计算机组成的基础结构开创了软件的新环境,而这些设备和计算机一般都有不同的硬件体系,自然有不同的操作系统。为了让一个程序能不需要修改就可以在这些设备和计算机上运行,就需要一种脱离特定的操作系统,脱离通过操作系统编译的语言。
如果说网络让大家成为一体的话,就需要一种大家都看的懂的语言进行沟通,而且这种语言是较为高级的语言,但是大家本身都有自己的语言,这个就是自己的操作系统,那就需要一个转换装置,把一种大家认可的语言分别转换成各自系统认识的语言。而这个转换装置在每一个操作系统上也并不一样,因为对应的操作系统不一样。就像联合国的同声传译装置一样,要把英语转换成各自国家的语言,就需要不同的同声传译设备。也许有一天中文也能作为国际语言被转换成各自国家的语言,当然这需要有对应的转换装置。

java由于生在这个网络的时代,所以从一开始就被赋予了成为网络语言的使命。而c语言,产生的时代不一样,所以一开始就没有这方面的考虑。当然,我们也可以让c语言跨平台,那就是开发不同操作系统、不同平台的转换装置,而不是在每个平台上分别编译。可是c语言已经产生那么多年,c语言的用法已经根深蒂固,想改是不容易的。因此,时势造英雄,时代的发展才产生了各种不同的语言。

1.2网络带来的挑战和机遇
既然java语言生在这个网络的时代,为网络而生,自然就需要具备一些网络的特点。
首先,应该支持从网络上装载这个程序;
其次,由于是在网络中,那么在安全方便加强。这包括两个方面。一是来源的安全,java解决这个挑战的方法是,提供一个受保护的环境,从网络上下载的程序可以以不同的安全定制级别运行。二是运行的安全,既然在网络中,那么你不属于你个人,你是属于大家的,那么你的运行就要有保障,java在程序的健壮性方面做了一些保证,一些有害的代码不会在java中出现,比如内存泄露,而由于没有了这个不必要的bug,也从另一方面提高了程序员的生产力。
最后,由于在网络中,设备之间的相互协作变得重要,这种协作包括对象的共享以及远程的调用。这个通过java的对象序列化和RMI来实现。同时,这也为分布式系统编程创造了新模型,并把面向对象编程的优点带到了网络上。RMI是一种实时性的调用,对于不要求实时的可以用消息机制去实现。

网络---产生平台无关性的需要
网络---产生安全性的需要
网络---产生网络自身的需要

1.3体系结构
java体系包括四个独立但相关的技术:
java程序设计语言
java class文件格式
java应用编程接口(API)
java虚拟机

java虚拟机+java API=java运行时系统=java平台

1.3.1java虚拟机
java虚拟机只是一个规范,实现可以很多种,可以软件实现,也可以硬件实现。
class文件中的字节码由执行引擎来执行。不同的虚拟机的执行引擎实现可能非常不同。
软件实现的执行引擎大致有三种:
1.一次性解释字节码
2.jit 即时编译器。这里的即时应该是马上执行的意思,也就是说第一次被执行的字节码会被编译成本地机器代码,被缓存起来,当方法以后被调用的时候可以重用。重用的时候就是即时执行了。不过这里会消耗内存来缓存本地机器代码。
3.对第二种的改进,因为把所有的本地机器代码都缓存起来,显然消耗内存。于是,我们需要虚拟机把那些使用最频繁的代码编译成本地机器代码缓存起来,使用不频繁的继续解释。一个自适应的优化器可以使得java虚拟机在80%-90%的时间里执行被优化过的本地代码。是一种很大的进步呀。
4.硬件芯片。用本地方法执行java字节码。这个本地方法最终应该还是会把java字节码转换成本地机器代码吧。

java中有两种方法:java方法和本地方法
java方法有java语言编写,编译成字节码,存储在class文件中。本地方法是有其他语言(比如c,c++,或者汇编语言)编写的,编译成和处理器相关的机器代码。本地方法保存在动态连接库中,格式是各个平台专有的。
java方法是与平台无关的,但是本地方法却不是。运行中的java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics