JAVA 从何说起

为了弄清楚Java是什么,就不得不从Java的诞生开始说起,就如同我们打算认识一个人,都会问这个人出生于哪里一样,Sun公司在1991年成立了一个Green的项目,专攻计算机在家电产品上的嵌入式应用,当时由于C++语言过于复杂和庞大,另外消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题,请记住跨平台三个字,这决定了Java的基因,天生就是跨平台的,为了解决困难,他们首先着眼于语言的开发(牛人就是牛人,开发语言不合适就直接先开发一门语言),1992年的夏天,Oak语言开发成功,这就是Java的前身,这个比我还晚出生的家伙,经过二十多年的发展,已经成了全球最流行的开发语言,同时也形成了自己独有的JAVA技术体系。

首先,Java体系结构包括四个独立但相关的技术

Java程序设计语言:就是我们最常提到的开发语言

Java class文件格式:所有Java语言开发的代码都会被编译成.class文件

Java API:Java的一些预先定义的函数

Java VM:Java的核心,因为所有的Java代码都是在Java虚拟机上运行

通过以上的认识,我们知道了Java的大体结构,那Java语言是如何被运行的呢?用JAVA语言编译源代码,编译成Java Class文件,然后在Java VM中运行class文件,当编写程序时,通过调用类(Java API)中的方法来访问系统资源,而当程序运行时,它通过调用class文件中实现了Java API的方法也满足程序的Java API调用。Java VM和Java API一起组成了一个“平台”,所有Java程序都在其上编译和运行,因此,它们有时也被称作Java运行时环境。

Java VM的主要任务是装载class文件并且执行其中的字节码。JavaVM包含一个类装载器(class loader),它可以从程序和API装载class文件;而Java API的类只在程序执行中需要时才会被装载。

Java字节码由执行引擎来执行。而不同的JavaVM中,其执行引擎的实现可能各不相同。最简单的执行引擎不是一次性解释字节码,而另一种称为“即时编译器(just-in-time compiler)”的执行引擎执行速度更快,但要消耗更多的内存资源。即时编译模式下,第一次被执行的字节码会被编译成本地机器代码并缓存下来以实现“复用”。

俗话说的好一图胜过十言,无图无真相

上图就是Java虚拟机的工作流程,有Jvm中class loader加载程序的类文件以及Java API的类文件到执行引擎中,由执行引擎来执行这些被加载进来的程序的类文件以及Java API的类文件,

上图是JVM虚拟机工作的具体方法

知道了Java技术的体系结构,那Java之所以这样受欢迎,还跟它天生的特性有关系,纯面向对象、多线程、结构化错误处理,垃圾收集、动态链接、动态扩展,

1998年,Sun把Java技术分拆为三个方向:

J2SE: Standard Edition

J2EE:Enterprise Edition

J2ME:Mobile Edition

2006年,Sun开源了Java技术;遵循GPL规范;并建立了OpenJDK组织管理此些代码;但是JDK只是提供了J2SE的标准实现,能实现C/S架构开发程序,但是如果要提供网页格式的内容展示,即B/S网站架构模式,就必须能输出带HTML标签的JAVA代码,为了便于开发,Sun公司定义了一个规范,即Servlet,也是Java的一个专有类,应用程序可以以HTTP、CGI格式的方式来接收用户的请求,并且能够理解HTTP、CGI请求的基础上,还能构建HTTP、CGI的响应报文,响应给客户端,同时,Servlet要求程序员在写Servlet规范的代码时,必须要以硬编码机制把所有的html都硬编码在Java中,这就要求程序员既要懂Java代码,还有东前端html样式设计,这无疑给程序员带来了很大的困难,于是出现了分体设计JSP,同样的这也是Java的一个特殊类,这样html就可以内嵌Java程序了,有一个叫jasper的翻译官来将jsp翻译成Servlet代码,也即是Java代码

上图即是JDK所提供的功能,最上层是Java开发语言,接下来的一层是Java开发工具包以及JavaAPI,一直到最下面Java Virtual Machine也就是Java虚拟机了,Java之所以能跨越Sloaris、windows、linux等平台,靠的就是Java虚拟机来实现。

Sun公司创建了第一个Servlet容器,即Java Web Server,但JWS只是为了演示Servlet的相应功能,所以其很不稳定。与此同时,ASF创建了JServ项目,一个能够与apache整合起来的servlet容器。1999年,Sun把JWS捐给了ASF,于是两个项目合二为一,即今天Tomcat的前身。第一个tomcat版本是Tomcat 3.x系列,而发布于2001年Tomcat4.0则是在此前基础上进行了重新设计和实现,其代码项目被命名为Catalina。Tomcat不是一个完整意义上的J2EE服务器,它甚至都没有提供对哪怕是一个主要Java EE API的实现,比如EJB、JMS、JMX、JavaMail等,但由于遵守apache开源协议,tomcat却又为众多的Java应用程序服务器嵌入自己的产品中构建商业的Java应用程序服务器,如JBoss和JOnAS。

尽管Tomcat对Jave EE API的实现并不完整,然而很企业也在渐渐抛弃使用传统的J2EE技术(如EJB)转而采用一些开源组件来构建复杂的应用。如Structs、Spring和Hibernate,而Tomcat能够对这些组件实现完美的支持。这也是tomcat比较流行的原因,当然除了开源项目实现,还有众多的商业实现,比如IBM的WebSphere、Oracle收购的WebLogic、Glassfish、被redhat收购的Jboss

时间: 2024-10-24 02:04:57

JAVA 从何说起的相关文章

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

由@NotNull 注解引出的关于Java空指针的控制(转)

Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键.“预防好过治疗”这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的代码.作为

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

Java自学序言

Java自学序言 亲爱的自己和各位读者朋友: 您们好! 这是作者本人自学Java编程开发的一系列文章,不具有一定的权威性,也算是自己一个人的学习笔记和总结,希望自己通过博客的形式将我自己的学习效率得到提高.如自学的稳重存在不足或错误的地方希望广大的博客朋友们多多指教.本人在此不胜感激! 学习Java是一件很痛苦的事儿,我自己要想不断的去挑战一下自己,把自己大学所学的Java知识能够巩固起来.不断的去改正自己开发中的不足之处.如何来学习Java?如何来更好的掌握Java开发语言?这些都是我们要不断

接口测试(java+testng+ant+jenkins)第五篇 java二

1.数据代码分离,方便维护. 一般做法是将数据保存在excel,通过程序读取. 2.读取excel数据. 在D盘新建excel,A列放url,B列放参数. 新建class redExcel package com.lx; import java.io.File; import java.io.IOException; import jxl.*; import jxl.read.biff.BiffException; public class redExcel{ public static voi