博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java概述
阅读量:7111 次
发布时间:2019-06-28

本文共 5718 字,大约阅读时间需要 19 分钟。

hot3.png

java体系结构包括四个独立相关的技术: java程序设计语言、 java class 文件格式、java应用编程接口、 java虚拟机。 当编写并运行一个java程序时,就同时使用了这四种技术。用java编写源代码,把它编译成java class文件,然后在java虚拟机中运行class文件。当编写程序时,通过调用类中的方法来访问系统中资源如io、网络内存等。当程序运行的时候它 可以调用class文件中的实现的方法来满足程序java api的调用。 java虚拟机的主要任务是装载class文件并且执行其中的字节码如图:  java虚拟机中包含一个类装载器也就是经常说到的class loader ,它可以从程序和API装载class文件。javaAPI中只有程序执行时需要的那些类才会被装载。字节码是由执行引擎来执行的。

    不同的java虚拟机中,执行引擎可能实现的非常不同。在由java实现的虚拟机中有三种执行引擎:一种叫“ 一次性解释字节码” 、二种叫“ 即时编译器 ”英文just-in-time compile、三种叫“ 自适应优化器 ”。第二种比第一种执行引擎效率上要高很多,执行速度也更快,但相对的缺点就是内存消耗很大。当内存消耗剧烈的时候,jvm就会出现异常。在这种情况下,即时编译器第一次被执行的字节码会被编译成本地机器代码,编译出的本地机器代码也会被缓存,当方法以后被调用时候可以重用。
     第三种引擎,自适应优化器,在这种方法里,虚拟机开始的时候解释字节码,但是会监视运行种的程序的活动,并且记录下使用最频繁的代码段。程序运行时,虚 拟机只把那些活动最频繁的代码编译成本地代码,其他代码由于使用的并不很频繁,继续保留字节码由虚拟机继续即时它们。一个自适应的优化器可以使用java 虚拟机种的80%-90%的时间里执行被优化的本地代码,而只需要编译10%-20%对性能有影响的代码。

     最后一种虚拟机由硬件芯片构成,它本地方法执行java字节码,这种执行引擎实际上是内嵌在芯片里的。

     有时间java虚拟机被称为java解释器。然而,考虑到执行字节码的方式可能不同的这个称谓可能会存在误导,虽然对于直接解释字节码的java虚拟机 来说,java解释器是一个合理的名字。但是讨论执行技术时,解释是一种我们所知道的易于实现而执行缓慢的特殊技术。因此解释器只标示是java虚拟机, 并不能代表任何含义。

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

java面向web(网络)编程的核心就是java虚拟机、它坚持java面向网络体系结构三大支柱的所有方面 平台无关性 、 安全性 和 网络移动性。java虚拟机是一台可以比作是一台抽象的计算器,其java api规范定义了每个java虚拟机都必须实现的特性,但是为每个特性实现都留下了很多选择。 举个例子说:虽然每个java虚拟机都必须能够执行 java字节码,但是用何种技术来执行是可以选择的,比如现在使用的就是c++和c的结合。

通过本地方法,java程序可以直接访问底层操作系统的资源。如果是开发者这样使用,就强依赖平台了。因为本地方法中使用的类库都与平台有 关。一个本地平台接口--java本地接口 java native interface .简称jni,使得本地方法可以在特定主机系统的任何一个java平台上实现运行。然而java平台的供应商并不一定必须支持jni。除了jni外。开发 者还可以提供自己的本地方法接口。如果希望开发者希望使用特别主机上的资源,又无法从java api访问,那么就可以写一个平台相关的java程序来调用本地方法。如果要保证平台无关性,那么就只能通过java api 来访问底层系统资源。

类装载器的体系结构

在java虚拟机上,存在着多个类装载器,因而结构图中的类装载器方法实际标示的是一个可能包含多个类装载器的子系统。

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

 java 应用程序能够在运行时安装用户定义的类装载器,这种类装载器能够使用自定义的方式类装载类。

 每一个类被装载的时候,java虚拟机都要监视这个类,看它到底是被启动装载器还是被用户自定义类装载器装载。当被装载的类引用了另外一个 类时,虚拟机就会使用装载第一个类的类装载器装载被引用的类。举例说明如果虚拟机使用一个特定的类装载器装载了volcano这个类,它就会使用这个类装 载器装载volcano类使用的所有类。如使用了一个叫lava类的一个方法,那么类装载器将动态的建立与lava类之间的关系。

     由于虚拟机采用这种方式进行类装载,所以被装载的类默认情况下只能看到被同一个类装载器装载的别的类。通过这种方式java体系结构允许java应用程序开辟多个命名空间。运行时java应用程序中的每一个类装载器都有它自己的命名空间。
    以上内容可以说,一个命名空间就是一个独立的内存体,内存与内存之间是不能通信的(这即时tomcat的核心,用户自定义的class loader,tomcat通过实现自己的class lodaer来实现不同的命名空间,装载不同的web工程)。
     一个应用程序能够从一个类或者多个类中实例化多个用户定义的类装载器,因此需要多少个用户自定义的类装载器,java应用程序就可以创建多少个。

java class 文件

     java class文件是一个可以跨平台的二进制文件,是通过java虚拟机来实现编译的。

java api

     java api是先天内嵌套在java 虚拟机平台上的。如果java 应用程序实现代码就必须先实现java api。

java 程序语言设计

     使用java语言进行开发时,有许多的优秀的特性,它是面向对象的、支持多线程、可以结构化处理错误(异常处理)、支持gc(垃圾收集)、可以动态链接(可以通过类装载器来装载类与类之间的关系)、可以支持动态扩展等。

java和其他技术相比如c++和c,java程序执行的速度可能比较低,但现在虚拟机的技术也在突破,java程序的执行效率也不见得会真 的比c和c++慢多少。当然即使特定的java虚拟机能够提供相当好的性能,但一般情况下,开发者还是无从选择程序在那一个java虚拟机上运行。

那么java如何解决性能问题呢?那么可以这样做:随程序附带一种虚拟机,把程序中对时间执行严格的程序本地化实现,把整个程序编译成一个单独的执行文件,就像c和c++一样,在安装java虚拟机时可以把程序预先编译成可执行文件等等方式。

     java可以把预先编译成单独的程序来执行,但带来的缺点就是不能动态扩展了。预编译是静态链接而不是动态链接,它产生出的是一个完全链接的,单独的本地可执行文件,但是这种可执行文件通常失去了运行时动态创建和链接新类型的能力。

 java除了性能问题以外、另一个缺陷内存管理和线程序调度上的缺陷。垃圾回收可以使得许多程序更健壮,但是垃圾回收也给程序运行时带来了 一些不确定性,因为开发者无法确认垃圾回收器什么时候回收垃圾,无法确认垃圾回收是否开始收集,也无法确认垃圾收集到底要持续多长时间。java虚拟机规 范对线程管理非常松散,这就会导致开发者无法了解应该如何调度线程,无法控制线程调度。

    java为了实现跨平台,也是付出了一定代价的即“最小公分母问题”,因为很多特性需要开发者必须去考虑和实现,甚至有些特性是必须要实现的,这些最小公分母的选择都将会在某种程度上会对相关操作系统不友好。

java天生就有动态链接特性,但这也牺牲了一部分东西,你看从一个类到另一个类的引用是符号化的,在静态链接的可执行程序中,类之间的引用 只是直接的指针或者偏移量。相反,在java class文件中 指向了另一个类或者类的方法、属性都是需要通过特殊的声明,同时java class文件又包含了很多调试信息,这些调试信息包含了局部变量的名称和类型。这样一个class文件、以及字节码指令集和java语言之间的密切联 系,都会使得java class文件逆向java源码文件,这就使得有人窃取你的源代码就相当容易。

     然而,有一种方法可以避免就是使用混淆器,混淆起可以对类名、参数等都混淆避免他人阅读源码时根据名称了解作者的意图。混淆器在国内使用非常少就不详述了。

Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE。这三块相互补充,应用范围不同。

J2SE就是Java2的标准版,主要用于桌面应用软件的编程;

J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;

J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

先学习j2se

要学习j2ee就要先学习j2se,刚开始学习j2se先建议不要使用IDE,然后渐渐的过渡到使用IDE开发,毕竟用它方便嘛。学习j2se推荐两本书,《java2核心技术一二卷》,《java编程思想》,《java模式》。其中《java编程思想》要研读,精读。这一段时间是基本功学习,时间会很长,也可能很短,这要看学习者自身水平而定。

不要被IDE纠缠

在学习java和j2ee过程中,你会遇到五花八门的IDE,不要被他们迷惑,学JAVA的时候,要学语言本身的东西,不要太在意IDE的附加功能,JAVA编程在不同IDE之间的转换是很容易的,过于的在意IDE的功能反而容易耽误对语言本身的理解。目前流行的IDE有jbuilder,eclipse和eclipse的加强版WSAD。用好其中一个就可以了,推荐从eclipse入手j2ee。因为Jbuilder更适合于写j2se程序。

选择和学习服务器使用配置

当你有了j2se和IDE的经验时,可以开始j2ee的学习了,web服务器:tomcat,勿庸置疑,tomcat为学习web服务首选。而应用服务器目前主要有三个:jboss、weblogic、websphere。有很多项目开始采用jboss,并且有大量的公司开始做websphere或weblogic向jboss应用服务器的移植(节省成本),这里要说的是,学习tomcat和jboss我认为是首选,也是最容易上手的。学习服务器使用配置最好去询问有经验的人(有条件的话),因为他们或许一句话就能解决问题,你自己上网摸索可能要一两天(我就干过这种傻事),我们应该把主要时间放在学习原理和理论上,一项特定技术的使用永远代替不了一个人的知识和学问。

学习web知识

如果你是在做电子商务网站等时,你可能要充当几个角色,这是你还要学习:
html,可能要用到dreamwave等IDE。
Javascript,学会简单的数据校验,数据联动显示等等

J2eeAPI学习

学习j2eeAPI和学习服务器应该是一个迭代的过程。
先学习jsp和servlet编程,这方面的书很多,我建立看oreilly公司的两本《jsp设计》和《java servlet编程》,oreilly出的书总是那本优秀,不得不佩服。
学习jdbc数据库编程,j2ee项目大多都是MIS系统,访问数据库是核心。这本应属于j2se学习中,这里拿出来强调一下。
学习jndi api,它和学习ejb可以结合起来。
学习ejb api,推荐书《精通ejb》
经过上面的这些的学习,大概可以对付一般的应用了。
有人说跟着sun公司的《j2ee tutorial》一路学下来,当然也可以。

学习ejb设计模式和看代码(最重要)

设计模式是练内功,其重要性可以这么说吧,如果你不会用设计模式的话,你将写出一堆使用了ejb的垃圾,有慢又是一堆bug,其结果不如不用ejb实现(ejb不等于j2ee)
无论学习什么语言,都应该看大量代码,你看的代码量不到一定数量,是学不好j2ee的
目前有很多开源的工程可以作为教材:

J2ee其他学习

当你渐渐对j2ee了解到一定深度时,你要开始关注当前领域中的一些技术变化,J2ee是一块百家争鸣的领域,大家都在这里提出 自己的解决方案,例如structs,hiberate,ofbiz等等,学习这些东西要你的项目和目标而定,预先补充一下未尝不可,但不用涉及太深,毕 竟学习原理和理论是最最重要的事。

目前常见j2eeAPI

JavaServer Pages(JSP)技术1.2
Java Servlet技术2.3
JDBC API 2.0
Java XML处理API(JAXP)1.1
Enterprise JavaBeans技术2.0
Java消息服务(JMS)1.0
Java命名目录接口(JNDI)1.2
Java事务API(JTA) 1.0
JavaMail API 1.2
JavaBeans激活架构(JAF)1.0
J2EE连接器体系结构(JCA)1.0
Java认证和授权服务(JAAS)1.0
学习上面的某些API要以你的项目而定,了解所有他们总之是有好处的

转载于:https://my.oschina.net/u/2397255/blog/600578

你可能感兴趣的文章
FireFox不支持event解决方法
查看>>
Linux系统生成随机密码的10种方法
查看>>
湖南省委短信平台改造方案
查看>>
我对51CTO的心得
查看>>
mysql基本操作-表结构的调整与索引
查看>>
我的友情链接
查看>>
你是否需要安全运营中心?
查看>>
mrjob报语法错误
查看>>
解决PXE批量网络安装Linux系统时kickstart自动识别硬盘名称的问题的方案
查看>>
JVM调优实战
查看>>
前端资源(4)
查看>>
开启多台GuestOS提示无loop设备可用
查看>>
PHP编写一些检查项函数
查看>>
笨鸟先飞学编程系列之二 基础代码的编写2(转)
查看>>
samza快速理解
查看>>
spark streaming容错机制
查看>>
空间和数据库存储的区别是什么
查看>>
我的友情链接
查看>>
新站不带www域名显露出来当天快照
查看>>
[图灵程序设计丛书].高效算法:竞赛、应试与提高必修128例.pdf
查看>>