`

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中的四个核心技术思想是构成Java平台基础的关键概念,它们对于理解和精通Java编程至关重要。以下是这四个核心技术思想的详细解析: 1. **Java虚拟机(JVM)** Java虚拟机是Java程序运行的基础,它的主要任务是...

    java中四个核心思想

    接下来,我们将详细探讨这四个核心思想:Java虚拟机、类装载器的体系结构、Java class文件以及Java API。 #### 1. Java虚拟机(JVM) Java虚拟机是Java平台的核心组成部分之一,它为Java程序提供了一个执行环境。JVM...

    Java四大核心技术思想详解.doc

    #### 四、面向对象的核心思想 Java作为一种典型的面向对象编程语言,其核心思想包括封装、继承和多态。 1. **封装**:将对象的状态信息隐藏在对象内部,仅对外提供公共的方法来访问这些状态信息,增强数据安全性。...

    java程序员技术体系

    总之,Java程序员的技术体系是一个深度和广度兼具的领域,涵盖基础语法、核心编程、图形和网络编程、企业级开发等多个方面。随着技术的发展,如Spring Boot、Spring Cloud等新兴框架的出现,Java程序员还需要不断...

    java四大核心思想.pdf

    Java四大核心思想 ...通过这种方法,Java的体系结构允许在一个Java应用程序中建立多个命名空间。运行时的Java程序中的每一个类装载器都有自己的命名空间。Java应用程序可以创建多少个(或多少种)被不

    java培训课程体系

    #### 一、Java核心技术(3周) ##### 1.1 基本元素 - **了解Java的历史和发展** - **掌握Java的安装与配置:** 包括JDK的下载、安装及环境变量的配置。 - **熟悉开发工具:** 如Eclipse或IntelliJ IDEA等集成开发...

    基于J2EE体系结构实现网上购物系统.pdf

    针对以上问题,J2EE(Java 2 Platform, Enterprise Edition)体系结构应运而生。它是一种适用于互联网Web计算特点的架构,相比传统的C/S模型,J2EE体系结构基于浏览器-服务器(B/S)模式,具备以下特点:组件化能力...

    JAVA面向对象基础教程 学习JAVA编程思想的很好的

    《JAVA面向对象基础教程》是一本深入浅出的JAVA编程思想学习资源,适合初学者快速入门,也适合有经验的开发者进一步深化对JAVA面向对象编程的理解。本教程全面覆盖了JAVA语言的核心概念,旨在帮助读者掌握JAVA编程的...

    java 编程思想 习题解答

    - **异常体系结构**:梳理Java中的异常层次结构,了解不同类型的异常之间的关系。 - **自定义异常**:演示如何创建自己的异常类,以及如何在程序中抛出和捕获这些异常。 - **try-catch-finally块**:详解这三个...

    Java软件开发工程师培训课程体系.pdf

    1. 第一阶段,核心Java2 CoreJava,重点在于奠定Java基础,学习基本语法、数据结构、核心API,深入理解面向对象编程,并涉及I/O、多线程、网络编程、XML解析和新特性等内容。这个阶段的目标是掌握Java的核心语法和...

    Java实战入门[一个资深Java培训老师倾力收藏].pdf

    第二章“类与对象”深入讲解了面向对象编程的思想,类和对象是Java语言的核心概念。本章讲解了类的结构,包括成员变量和成员方法;同时,还对方法的结构进行了详细的讲解,包括方法的参数、返回值等。 第三章“登录...

    java-Corba编程技术

    它的核心思想是通过接口定义语言(IDL,Interface Definition Language)来描述对象接口,确保不同系统间的对象能够互相调用方法。 **一、关于 CORBA** CORBA 提供了一种平台和语言无关的解决方案,允许开发者使用...

    java编程第4版完整版,完整书签,扫描但文字可搜索复制

    《Java编程思想》第四版介绍了Java I/O的体系结构,详细讲解了各种输入输出流的使用,包括字节流、字符流以及序列化等高级概念。 ### 高级特性 #### 多线程 Java的多线程模型允许程序同时执行多个线程,提高了...

    JAVA编程电子书专题下载

    - **内容概述**:此书聚焦于Java Applet技术的实现细节,通过多个案例深入浅出地讲解如何创建可嵌入网页中的Java小程序。 - **适用人群**:对Java Applet技术感兴趣的Web开发者或教师。 - **核心知识点**: - Java ...

Global site tag (gtag.js) - Google Analytics