Java的发展
- Java之父:詹姆斯·高斯林
- 最早语言为Oak,用于嵌入式系统,没有成功;
- 1995年互联网发展,改名为Java,开始火爆,提出Write once run any where的原则;
- 1996年1月 发布JDK1.0,jvm为Sun Classic VM;
- 1996年5月 首届JavaOne大会;
- 1997年2月 JDK1.1(内部类、反射、jdbc、javabean、rmi);
- 1998年 JDK1.2 发布J2Se J2EE J2ME swing jit Hotspot VM;
- 2000年5月 JDK1.3 Timer Java2d;
- 2002年2月 JDK1.4 Struts Hibernate Spring 正则表达式 NIO 日志 Xml解析器;
- 2004年9月 JDK1.5(tiger) 自动装箱拆箱 泛型 注解 枚举 增强for 可变参数 Spring2.X;
- 2006年 JDK6 JavaSe JavaEE JavaME 提供脚本语言支持 支持http服务器api;
- 2009年 Java7 Jigsaw模块化 Orical74亿收购Sun;
- 2014年 Java8 Lambda表达式 函数式接口 方法引用 默认方法 Stream;
- 2017年 Java9 模块化
Java技术体系
- Java程序设计语言
- 各硬件平台上的Java虚拟机
- Class文件格式,可以自己设计语言,自己编写编译器,生成相同的class文件即可
- Java API
- 第三方的Java类库
Sun Classic VM
- 已经淘汰,是世界上第一款商用虚拟机,只能使用纯解释器(没有JITJust in time编译器)的方法来执行Java代码。
Exact VM
- Exact Memory Management 准确式内存管理; 编译器和解释器混合工作以及两级即时编译器。
HotSpot VM
- 热点代码技术,使用最多的虚拟机产品,并非由Sun公司开发。官方JDK均采用HotSpot VM。
KVM
- kilobyte 简单、轻量、高度可移植,在手机平台运行,运行速度慢。
JRockit
- BEA公司开发,是世界上最快的Java虚拟机,专注于服务端应用,全部靠编译器执行。
J9
- IBM开发 原名:IBM Techn0ology for Java Virtual Machine IT4j
Davik
- 不是java虚拟机,寄存器架构而不是栈结构,执行dex(dalvik Executable)文件。
Microsoft JVM
- 只能运行在windows下面。
Azul VM Liquid VM
- 高性能的java虚拟机,在HotSpot基础上改进,专用的虚拟机。
Taobao VM
- 淘宝公司开发
程序计数器
- 程序计数器(处于线程独)占区是一个非常小的内存空间,它可以看成是当前线程所执行的字节码的行号指示器。此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟字节码指令的地址。如果正在执行的是native方法,那么这个计数器的值为undefined。
注:java中没有goto,为保留字
虚拟机栈
- 虚拟机栈描述的是Java方法执行的动态内存模型。
栈帧: 每个方法执行都要创建一个栈帧,方法执行完毕,栈帧销毁。用于存储局部变量表,操作数栈,动态链接,方法出口等。
局部变量表:存放编译期可知的各种基本数据类型,引用类型,局部变量表的大小在编译期便已经可以确定,在运行时期不会发生改变。
栈的大小:如果栈满了,StackOverFlowError,递归调用很常见。
public class Hello {
public static void main(String[] args) {
test();
}
public static void test() {
System.out.println("start......");
test();
}/*给大家推荐一个免费的学习交流君样:826021115 */
}
// 报错Exception in thread "main" java.lang.StackOverflowError
本地方法栈
- 本地方法栈为虚拟机执行native方法服务
Java堆