您的位置:首页 > 编程语言 > Java开发

01-java技术体系基础

2017-08-08 08:02 232 查看

java体系基础

理论

编程语言:

系统级: C, C++, go, erlang ...

应用级: C#, Java, Python, Perl, Ruby, php

虚拟机: jvm(java虚拟机), pvm(python的虚拟机)

动态网站: asp, .net, jsp, php

动态网站:

客户端动态: 数据处理在客户端进行, 早期是这样实现, 但非常不安全, 现在基本已经废弃.

服务器动态: 用CGI协议将要处理的程序转交给语言运行。

CGI的部分实现:

webapp server:

jsp: tomcat, jboss, jetty

php: php-fpm

java编程语言

SUN公司开发并开源

作者: James Gosling

项目: Green Project

原名: Oak

更名: 1995年更名为java, 在SunWorld大会正式发布Java 1.0版本

特性: Write Once、Run Anywhere, 翻译过来就是一次编写, 到处运行。

java的历史

1995: java 1.0

1996: JDK(Java Development Kit, 翻译java开发工具箱), 包含一个JVM(SUN Classic VM,经典的jvm), 当时的jvm是纯解释运行,所以性能非常低。

1997: SUN发布jdk 1.1

1997: JDK 1.2

SUN把java技术分拆为三个方向:

J2SE: Standard Edition

J2EE: Enterprise Edition

J2ME: Mobile Edition

代表性技术: EJB, JAVA Plug-in, Swing, JIT编译器(即时编译器)

1999:HotSpot虚拟机

2000:JDK 1.3

2002: JDK 1.4, 此时jdk变得非常成熟了

2006: Sun开源了java技术, 遵循GPL规范, 并建立了OpenJDK组织管理此些代码;

2007: 发布JDK 1.7, 里程碑

java虚拟机: JRockit, HotSpot;

Java体系结构:

java编程语言

Java Class文件格式

Java API

Java VM

java的执行流程:

.java: java的源代码

.class: java的类文件, 类文件必须遵循一定的规范, 使得编译好的文件能在遵循规范的机器上运行, 最终都要在jvm上运行

java代码编译过程







首先
*.java
源码经过预先编译后, 会变为
*.class
文件。

*.class
文件运行如果需要调用其他的类文件,比如上图,
1.class
,
2.class
就会加载进来一起运行。

jvm的核心组成部分:

Class Loader

执行引擎

如图





Class Loader, 类加载器先加载需要执行的程序类文件(需要预先编译好)和Java API的类文件。

执行引擎就在操作系统上执行Class Loader加载的类文件。



Java编程语言的特性:

面向对象、多线程、结构化错误处理

垃圾手机、动态链接、动态扩展

GC: 垃圾回收器, 主要面向堆内存空间中的垃圾回收

三个技术流派

J2SE ==> Java 2 SE, java标准版

J2EE ==> Java 2 EE, java企业版

J2ME ==> Java 2 ME, java微缩版

jdk 1.5包含的技术



Java Language: JAVA语言

Dewelopment Tools & APIs: 开发工具和API

java: java语言

javac: java语言编译器

javadoc: java文档,支持从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。

apt: 源代码文件进行检测找出其中的annotation后, 使用annotation processors来处理annotation。而annotation processors使用了一套反射API并具备对JSR175规范的支持。

jar: java归档命令

Deployment Technologles: 部署技术

Deployment, 冷部署

Java Web Start, 通过web页面部署

Java Plug-in, 通过java插件部署

User Interface Toolkits: 用户接口工具箱

Integration Libraries: 集成库

Other Base Libraries: 其他基本库

lang & util Base Libraries: 语言工具基本库

Java Virtual Machine: Java虚拟机

Java Hotspot Client Compiler

Java Hotspot Server Compiler

jvm支持混合模式, 既是客户端又是服务端

JDK与JRE

JDK包含jre, 但jre不包含JDK

JRE没有Java Language和Dewelopment Tools & APIs

JRE仅负责运行JAVA代码

JDK调试开发java代码

JVM运行时区域, 运行为多线程



方法区: 线程共享, 用于存储被虚拟机加载的类信息、变量、静态变量等; 该方法区的变量是持久代的, 也就是随着进程的生命周期而结束。

堆: java堆是jvm所管理的内存中最大的一部分, 也就是GC管理的主要区域; 主流的算法都基于分代收集方式进行, 新生代和老年代, 线程共享;

Java栈:

线程私有, 存放线程自己的局部变量等信息;

线程私有, 生命周期与线程相同, 所以线程启动就自动为其创建一个栈, 只不过虚拟机栈描述的是java方法执行内存模型, 说白了就是每个方法被执行时, 都会给其创建一个栈针, 用于存储线程自己的局部变量, 操作数, 动态连接, 方法出口等等;

PC寄存器(Program Counter Register)

PC寄存器也称程序计数器, 这段空间是一段非常小的内存空间, 它的主要作用可以看作是当前线程所执行字节码行号的指示器。 例如计算机执行任何一个程序时, 一段代码有N个指令, CPU取一条指令运行一条指令, 那么CPU必须有条指针是指向这条指令的, 而这个指针就在CPU的寄存器中, 里面保留了下一次我应该运行代码或指令所在内存空间的地址。这段空间就叫指针寄存器; 对于java 而言, 它是运行在虚拟机上的, 所以它需要自己组织一段内存空间, 为每个线程在其jvm内部维持其程序计数器。所以说程序计数器是每个线程都独占的。

它是一个很小的内存空间, 里面保留了当前线程已经运行到的指针的行号(或者下一行)。

线程独占的内存空间。

本地方法栈: 用于在哪个主机上实行的特有方法的, 所以具体的方法是依赖于平台的。

每个线程都有自己独占的部分, 和共享的部分。

JAVA 2 EE包含:

JAVA 2 SE

Servlet、JSP、EJB、JMS、JMX、JavaMail

Servlet: 用在server端的应用程序, 可以通过CGI协议或其他协议与前端进行数据交互。

Servlet Contaier工作方式: Servlet容器, Servlet是一个类

println('<\h1>')

html标签要硬编码在应用程序中; 后来出现jsp, jsp就简化了程序员要硬编码html的问题。

JSP的工作方式:

<html>
<body>
<h1> .. </h1>
<%
内部java代码
%>
</body>
</html>

# jsp工作在Servlet的前端, 这样程序员在调用Servlet的时候就不用自己硬编码写html了。
# jsp能让java代码内嵌在html中


JDK只提供了java 2 SE的标准实现

Web Container: 由三部分构成

JDK

Servlet

JSP

其中Servlet和jsp是一种规范, JDK是SUM开源。

Web Container的实现

实现: 就是将JDK、Servlet, JSP组织在一起

商业实现:

WebSphere: IBM 企业级EE容器

WebLogic: (BEA --> Oracle)

Oc4j

Glassfish

Geronimo

JOnAS

JBoss

开源实现

tomcat

jetty

resin

三种开源实现的对比

对比的版本tomcat 7, Jetty 7, Resin 3.1 - Compiler

tomcat:

可以做为独立的服务器运行。内置web server

支持远程部署及管理。

完全开源

编译所有Jsp, 大约需要8s左右。

jetty: 轻量级web容器

resin: 高性能J2EE Application server

可以拿来学习或做开源项目可以, 但不允许做商业项目

开源JDK:

Apache Harmony(2011年10月已经停止开发)

OpenJDK
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: