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
- webapp server:
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编译器(即时编译器)
- SUN把java技术分拆为三个方向:
- 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