`

Java体系结构中的四个核心技术思想

 
阅读更多

    看着瓜娃瓜娃,最近突然很有兴趣想了解下Java这杯"咖啡"的核心技术思想。于是翻开Java虚拟机、java跨平台技术, java API讲义一些资料,有兴起笔摘星,和各位有兴趣的朋友们共享,并虚心求教,若有错误,一起纠正学些。

 

1.  Java虚拟机

 

    java面向网络的核心就是java虚拟机。

 

    java虚拟机的主要任务是装在class文件并且执行其中的字节码。Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件。Java API中只有程序执行时需要的那些类才会被装载。字节码由执行引擎来执行。

 

    不同的java虚拟机中,执行引擎可能实现得非常不同。在由软件实现的虚拟机中,最简单的执行引擎就是一次性解释字节码。另一种执行引擎更快,但是也更消耗内存,叫做"即时编译器(just-in-time compiler)"。在这种情况下,第一次被执行的字节码会被编译成本地机器代码。编译出的本地机器代码会被缓存,当方法以后被调用的时候可以重用。第三种执行引擎是自适应优化器。在这种方法里,虚拟机开始的时候解释字节码,但是会监视运行中程序的活动,并且记录下使用最频繁的代码段。程序运行的时候,虚拟机只把那些活动最频繁的代码编译成本地代码,其他的代码由于使用得不是很频繁,继续保留为字节码-由虚拟机继续解释它们。一个自适应的优化器可以使得java虚拟机在80%~90%的时间里执行被优化过的本地代码,而只需要编译10%~20%的对性能有影响的代码。

 

    当Java虚拟机是由主机操作系统上的软件实现的时候,Java程序通过调用本地方法(native method)和主机交互。java中有两种方法: Java方法和本地方法。Java方法是由Java语言编写,编译成字节码文件,存储在class文件中的。本地方法是由其他语言(比如c,c++或汇编语言)编写的,编译成何处理器相关的机器代码。本地方法保存在动态链接库中,格式是各个平台专有的。运行中Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本地方法是联系Java程序和底层主机操作系统的连接方法。

 

    通过本地方法,Java程序可以直接访问底层操作系统的资源。一个本地方法接口(Java Native Interface, JNI)-使得本地方法可以在特定主机系统的任何一个Java平台实现上运行。

 

    如果希望使用特定主机上的资源,它们又无法从Java API访问,那么可以写一个平台相关的Java程序来调用本地方法。如果希望保证程序的平台无关性,那么只能通过Java API来访问底层系统资源

 

2. 类装载器的体系结构

 

   一个Java应用程序可以使用两种类装载器:"启动(bootstrap)"类装载器和用户定义的类装载器。启动类装载器(这是系统中唯一的)是java虚拟机实现的一部分。启动类装载器通常使用某种默认方式从本地磁盘中装载类,包括Java API类(启动类装载器也被称为原始类装载器、系统类装载器或者默认类装载器)。

 

   Java应用程序能够在运行时安装用户定义的类装载器,这种类装载器能够使用自定义的方式来装载类。例如,从网络下载class文件。尽管启动类装载器是虚拟机实现的本质部分,而用户定义的类装载器不是,但用户定义的类装载器能够用java来编写,能够被编译成class文件,能够被虚拟机装载,还能够像其它对象一样实例化。

 

   由于有用户定义类装载器,所以不必再编译的时候就知道运行中的java应用程序中最终会加入的所有的类。用户定义的类装载器使得在运行扩展Java应用程序成为可能。当它运行时,应用程序能够解决它需要哪些额外的类,能够决定是使用一个或是更多的用户定义的类装载器来装载。由于类装载器是用Java编写的,所以用任何在Java代码中可以表述的风格来进行类装载。这些类可以通过网络下载,可以从某些数据库中获取,甚至可以动态生成。

 

   每一个类被装载的时候,Java虚拟机都监视这个类,看到它到底是被启动类装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载引用的类。例如,如果虚拟机使用一个特定的类装载器装载Volcano这个类,它就会使用这个类装载器装载Volcano类使用的所有类。

 

   由于Java虚拟机采取这种方式进行类的装载,所以被装载的类默认情况下只能看到被同一个类装载器装载的别的类。通过这种方法,Java的体系结构允许在一个Java应用程序中建立多个命名空间。运行时的Java程序中的每一个类装载器都有自己的命名空间。

 

   Java应用程序可以创建多少个(或多少种)被不同的类装载器装载的类存放在不同的命名空间中,它们不能相互访问,除非应用程序显示地允许这么做。当编写一个Java应用程序的时候,从不同源文件装载的类可以分隔在不同的命名空间中。通过这种方法,就能够使用Java类装载器的体系结构来控制任何不同源文件中装载的代码之间的相互影响,特别是能够阻止恶意代码获取访问或破坏善意代码的权限。

 

   Web浏览器是一个动态扩展的例子,web浏览器使用用户定义的类装载器从网络下载用于Java applet的class文件。Web浏览器使用一个用来安装用户定义类装载器的Java应用程序。这个用户定义的类装载器通常被称为Java Applet类装载器,它知道如何向HTTP服务器请求class文件。Java Applet可以作为动态扩展的例子,因为Java应用程序并不知道它什么时候会开始从网络下载浏览器请求的class文件。只有当浏览器遇到有Java applet的页面时,才决定是否需要下载class文件。

 

   web浏览器启动的Java应用程序通常为每个提供class文件的网络地址分别创建不同的用户定义类装载器,因此,不同的用户定义类装载器装载不同来源的class文件。这就可以把它们分别放置在Java主机应用程序的不同命名空间之下。由于不同来源的Java applet文件放置在不同的命名空间中,恶意的Java applet代码就不会直接访问从别的地方下载的class文件。这就能够限制或阻止不同来源的代码之间的相互访问。

 

3. Java class文件

 

    Java class文件主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。这种途径途径打破了C或者C++等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而Java class文件时可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。

 

    当编译和连接一个C++程序时,所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运行,因为这个二进制文件包含了对目标处理器的机器语言。而Java编译器把Java源文件的指令翻译成字节码,这种字节码就是Java虚拟机的"机器语言"。

 

    class文件设计得紧凑,因此它们可以快速地在网络上传送。其次,由于Java程序是动态连接和动态扩展的,class文件可以在需要的时候才下载。这个特点使得Java应用程序能够安排从网络上下载class文件的时间,从而可以最大限度地减少终端用户的等待时间。


4. Java API

 

   Java API通过支持平台无关性和安全性,使得Java适应于网络应用。Java API是运行库的集合,它提供了一套访问主机系统资源的标准方法。运行Java程序时,虚拟机装载程序的class文件所使用的Java API class文件。所有被装载的class文件(包括从应用程序中和从Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了再Java虚拟机上运行的整个程序。

 

   在一个平台能偶支持Java程序以前,必须在这个特定平台上明确地实现API的功能。为访问主机上的本地资源,Java API调用了本地方法。由于Java API class文件调用了本地方法,Java程序就不需要再调用它们了。通过这种方法,Java API class文件为底层主机提供了具有平台无关性、标准接口的Java程序。对Java程序而言,无论平台内部如何,Java API都会有同样的表现和可预测的行为。正是由于在每个特定的主机平台上明确地实现了Java虚拟机和Java API,因此,Java程序自身就能够成为具有平台无关性的程序。

 

   Java API在java安全性模型方面也有贡献。当Java API的方法进行任何有潜在危险的操作(比如进行本地磁盘写操作)之前,都会通过查询访问控制器来检验是否得到了授权。访问控制器是一个类,该类用来执行栈检验,已决定是否允许某种操作。

 

   Java程序设计语言

 

   Java程序设计语言组合了许多软件技术。


   面向对象。
   多线程。
   结构化异常处理。
   垃圾收集。
   动态连接。
   动态扩展。

  
  

分享到:
评论
24 楼 slaser 2010-06-23  
maozj 写道
slaser 写道
这个能叫技术思想么?只能叫具体技术。


分享下你读技术思想的理解

你误解了我的意思,我意思说你写的东西不叫思想,而是具体技术。
不介意你说具体技术,但是那确实不是思想。
比如说把某种高级语言通过编译成为中间语言,再运行于为各个平台编写的语言解释器之上,从而完成语言的跨平台。这个可以算一种思想,基于这种思想的语言解释器在java里面的体现就是JVM。JIT原理上也可以算思想。
至于Class Loader, 你可以谈论为什么需要Class Loader, java的Class Loader 为什么会这样设计,这就是思想。
另外来说,感觉你的帖子里面有很多像从书里面copy出来的莫名奇妙的话。
比如:”java面向网络的核心就是java虚拟机。“。
23 楼 shijiyu 2010-06-23  
coffeesweet 写道
很想楼主仔细说说类装载器实现过程
因为前段时间我的项目中应用了一个类似spring的框架,并且有自己的classLoader,
当把项目部署到商用的app容器上时就出现类找不到的问题,但这些类确实是存在的,我估计是app容器也有自己的classLoader和开发框架的classLoader之间的问题,就像楼主说的一个类被加载了,他所引用的类会被第一个加载它的loadr加载,会不会出现一个类和它所引用的类被不同的classLoader加载,然后有互相不能访问,就会报ClassNotFound的异常呢,我的项目就出现了这样的问题,不知道各位能不能帮忙分析下.

你所说的问题 肯定是类加载器的问题 出现了在这个类加载器中调用了另外其它的类加载器中类 可以去看下OSGI中的类加载的思想
22 楼 maozj 2010-06-23  
slaser 写道
这个能叫技术思想么?只能叫具体技术。


分享下你读技术思想的理解
21 楼 maozj 2010-06-23  
slaser 写道
这个能叫技术思想么?只能叫具体技术。

1.  虚拟

2.  装载

3.  文件

4.  api
20 楼 slaser 2010-06-23  
这个能叫技术思想么?只能叫具体技术。
19 楼 coffeesweet 2010-06-23  
很想楼主仔细说说类装载器实现过程
因为前段时间我的项目中应用了一个类似spring的框架,并且有自己的classLoader,
当把项目部署到商用的app容器上时就出现类找不到的问题,但这些类确实是存在的,我估计是app容器也有自己的classLoader和开发框架的classLoader之间的问题,就像楼主说的一个类被加载了,他所引用的类会被第一个加载它的loadr加载,会不会出现一个类和它所引用的类被不同的classLoader加载,然后有互相不能访问,就会报ClassNotFound的异常呢,我的项目就出现了这样的问题,不知道各位能不能帮忙分析下.
18 楼 maozj 2010-06-23  
jameswxx 写道
直接把《深入java虚拟机》电子版传上来吧

那样能达到真正的分享和交流吗
17 楼 maozj 2010-06-23  
chen88358323 写道
jameswxx 写道
直接把《深入java虚拟机》电子版传上来吧

Java深度历险


呵呵 要动手 光速般的看不是个好策略 真正的核心来自孰能生巧 这是唯一途径
16 楼 maozj 2010-06-23  
jameswxx 写道
直接把《深入java虚拟机》电子版传上来吧

那样不能达到我的效果
15 楼 chen88358323 2010-06-23  
jameswxx 写道
直接把《深入java虚拟机》电子版传上来吧

Java深度历险
14 楼 jameswxx 2010-06-23  
直接把《深入java虚拟机》电子版传上来吧
13 楼 ckn126 2010-06-22  
楼主能不能将一下,java程序设计方面的内容啊?
12 楼 qiaoqinqie 2010-06-22  
底层的东西 楼主很有心啊
11 楼 maozj 2010-06-22  
beneo 写道
我很奇怪你每天都能整出一篇文章,why,why,why


巾帼不让须眉 如果真是 那实属幸福
10 楼 maozj 2010-06-22  
steafler 写道
建议楼主将类装载器实现过程详细化

恩, 定会
9 楼 maozj 2010-06-22  
beneo 写道
我很奇怪你每天都能整出一篇文章,why,why,why

呵呵,你想说什么呢
8 楼 beneo 2010-06-22  
我很奇怪你每天都能整出一篇文章,why,why,why
7 楼 xici_magic 2010-06-22  
未完待续?
6 楼 steafler 2010-06-22  
建议楼主将类装载器实现过程详细化
5 楼 maozj 2010-06-22  
hareamao 写道
maozj 写道
hareamao 写道
强烈建议12345条跟标题的中文数字对应

第5就免了

那你改一改,写成其他,免得人家误会么。

-----------------
恩 遵照你所说~~

相关推荐

    java中四个核心思想

    Java虚拟机 类装载器的体系结构 Java class文件 Java API

    《Java程序设计案例教程》课程标准.doc

    课程性质与设计思路 1.1课程的性质 计算机网络技术专业,确立了网络工程、网络管理与维护、网络应用开发、信息类网 络基础服务四个方面为地方信息化建设培养技术应用型网络人才的专业培养目标。课程 设置坚持以能力...

    《面向对象程序设计java)》课程整体教学设计.docx

    并行课程:数据库设计与应用 后续课程: :《JSP动态网站设计开发》、《安卓手机应用开发》 二、课程概述 课程定位 《面向对象程序设计》是计算机类专业的核心课程之一,也是基础课程之一, 在整个课程体系中起专业...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE...

    基于SNMP的网络拓扑发现.doc

    基于SNMP的网络拓扑发现 一、 SNMP简介 SNMP(Simple Network Management Protocol,...图3.1说明了SNMP网络管理框架的一般体系结构,它由四个主要部件构成,分别是:通信网络、网络协议、网络管理进程和被管网络实体。

    二十三种设计模式【PDF版】

    2.设计模式是比 J2EE 等框架软件更小的体系结构,J2EE 中许多具体程序都是应用设计模式来完成的,当你深入到 J2EE 的内 部代码研究时,这点尤其明显,因此,如果你不具备设计模式的基础知识(GoF 的设计模式),你很难...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    真正的客户机/服务器体系结构。  2.图形化用户界面,使系统管理和数据库管理更加直观、简单。  3.丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地。  4.SQL Server与Windows NT完全集成,利用...

    GoodProject Maven Webapp.zip

    在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。 1:数据访问层:主要是对非原始数据...

    asp.net知识库

    [ASP.NET 2.0]PageParser.GetCompiledPageInstance中存在一个Bug 如何在DotNet 2的登录组件中检索用户的锁定状态及解锁? ASP.NET 2.0, 想说爱你不容易 SqlDataSource WEB控件:当DeleteCommandType= 遭遇 ASP.NET ...

    2009.6.19—30举办3S研讨会暨Google Earth与Google Map等仿真建模与共享及ARCGIS与遥感高级程序员培训班

    1、介绍目标前国际上最优秀的GIS软件ARCCIS9体系结构及全面了解ARCCIS9.0桌面系统的体系结构和功能介绍,介绍ESRI的ARC-CATALOG,ARCTOOLBOX通用GIS解决方案的精彩设计以及最新的ARCCISENGINE和ARCCIS SERVER。...

    基于J2EE框架的个人博客系统项目毕业设计论...

    真正的客户机/服务器体系结构。  2.图形化用户界面,使系统管理和数据库管理更加直观、简单。  3.丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地。  4.SQL Server与Windows NT完全集成,利用...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

Global site tag (gtag.js) - Google Analytics