JVM--走进Java
1.1 概述
1) Java 能获得如此广泛的认可,除了他拥有一门结构严谨,面向对象的编程语言之外,还有许多不可忽视的有点:Java 摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;他提供了一个相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏和指针越界问题;他实现了热点代码检测和运行时编译及优化,这使得 Java 应用能随着运行时间的增加而获得更高的性能;他有一套完整的应用程序接口,还有无数来自商业结构和开源社区的第三方类库来帮助他实现各种各样的功能。
1.2 Java技术体系
1) 从广义上讲,Clojure、Jruby、Groovy 等运行于 Java 虚拟机上的语言及其相关的程序都属于 Java 技术体系中的一员。
如果从传统意义上来看,Sun 官方所定义的 Java 技术体系包括以下几个部分:
Java 程序设计语言
各种硬件平台上的 Java 虚拟机
Class 文件格式
Java API 类库
来自商业机构和开源社区的第三方 Java 类库
2) 我们可以把 Java 程序设计语言、Java 虚拟机、Java API 类库这三部分统称为 JDK(Java Development Kit),JDK是用于支持 Java 程序开发的最小环境。另外,可以把 Java API类库中的 Java SE API 子集和 Java 虚拟机这两部分统称为 JRE(Java Runtime Environment)。JRE 是支持 Java 程序运行的标准环境。
3) 根据各个组成部分的功能来进行划分,Java 技术体系所包含的内容
4) 根据技术所服务的领域来划分,或者说按照 Java 技术关注的重点业务领域来划分,Java 技术体系可以分为4个平台,分别为:
Java Card: 支持一些 Java 小程序(Applets)运行在小内存设备(如智能卡)上的平台
Java ME(Micro Edition): 支持 Java 程序运行在移动终端上的平台,对 Java API 有所精简,并加入了针对移动终端的支持,这个版本以前称为 J2ME
Java SE(Standard Edition): 支持面向桌面级应用(如 Windows 下的应用程序)的 Java平台,提供了完整的 Java 核心 API,这个版本以前称为 J2SE
Java EE(Enterprise Editon): 支持使用多层框架的企业应用(如 ERP、CRM应用) 的Java 平台,除了提供 Java SE API 外,还对其做了大量的扩充并提供了相关的部署支持,这个版本以前称为 J2EE
1.3 Java 发展史
1) Java 技术发展史
版本 | 描述 |
---|---|
1991年1月 | Sun公司成立了Green项目小组,专攻智能家电的嵌入式控制系统 |
1991年2月 | 放弃C++,开发新语言,命名为“Oak” |
1991年6月 | JamesGosling开发了Oak的解释器 |
1992年1月 | Green完成了Green操作系统、Oak语言、类库等开发 |
1992年11月 | Green计划转化成“FirstPerson”,一个Sun公司的全资母公司 |
1993年2月 | 获得时代华纳的电视机顶盒交互系统的订单,于是开发的重心从家庭消费电子产品转到了电视盒机顶盒的相关平台上。 |
1994年6月 | FirstPerson公司倒闭,员工都合并到Sun公司。Liveoak计划启动了,目标是使用Oak语言设计出一个操作系统。 |
1994年7月 | 第一个Java语言的Web浏览器WebRunner(后来改名为HotJava),Oak更名为Java。 |
1994年10月 | VanHoff编写的Java编译器用于Java语言 |
1995年3月 | 在SunWorld大会,Sun公司正式介绍了Java和HotJava。 |
1996年1月 | JDK1.0发布 |
1997年2月 | J2SE1.1发布 |
1998年12月 | J2SE1.2发布 |
1999年6月 | 发布Java的三个版本:J2SE、J2EE、J2ME |
2000年5月 | J2SE1.3发布 |
2001年9月 | J2EE1.3发布 |
2002年2月 | J2SE1.4发布 |
2004年9月 | J2SE1.5发布,将J2SE1.5改名JavaSE5.0 |
2005年6月 | JavaSE6.0发布,J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME |
2006年12月 | JRE6.0发布 |
2006年12月 | JavaSE6发布 |
2009年12月 | JavaEE6发布 |
2009年4月 | Oracle收购Sun |
2011年7月 | JavaSE7发布 |
2014年3月 | JavaSE8发布 |
2) 1996年1月23日,JDK 1.0 发布,Java 语言有了第一个正式版本的运行环境。JDK 1.0 提供了一个纯解释执行的 Java 虚拟机实现(Sun Classic VM)。JDK 1.0 版本的代表技术包括:Java 虚拟机、Applet、AWT等。
3) 1997年2月19日,Sun 公司发布了 JDK 1.1,Java 技术的一些最基础的支撑点(如 JDBC 等)都是在 JDK 1.1版本中发布的, JDK 1.1版的技术代表有:JAR 文件格式、JDBC、JavaBeans、RMI。Java 语法也有了一定的发展,如内部类和反射都是在这个时候出现的。
4) 1998年4月8日,JDK 迎来了一个里程碑式的版本 JDK 1.2,工程代号为 Playground(竞技场),Sun 在这个版本中把 Java 技术体系拆分为3个方向,分别是面向桌面应用开发的 J2SE(Java 2 Platform, Standard Edition),面向企业级开发的 J2EE(Java 2 Platform, Enterprise Edition)和面向手机等移动终端开发的 J2ME(Java 2 Platform, Micro Edition)。在这个版本中出现的代表性技术非常多,如 EJB、Java Plug-in、Java IDL、Swing 等,并且这个版本中 Java虚拟机第一次内置了 JIT(Just In Time)编译器(Java 1.2中曾并存过3个虚拟机,Classic VM、HotSpot VM 和 Exact VM,其中 Exact VM只在 Solaris 平台出现过;后面两个虚拟机都是内置 JIT 编译器的,而之前版本所带的 Classic VM 只能以外挂的形式使用 JIT 编译器)。在语言和 API 级别上, Java 添加了 strictfp 关键字与现在 Java 编码之中极为常用分一系列 Collection 集合类。
5) 1999年4月27日,HotSpot 虚拟机发布,HotSpot 最初由一家名为 “Longview Technologies” 的小公司开发,因为 HotSpot 的优异表现,这家公司在 1997 年被 Sun 公司受够了。HotSpot 虚拟机发布时时作为 JDK 1.2 的附加程序提供的,后来他成为了 JDK 1.3 及之后所有版本的 Sun JDK 的默认虚拟机。
6) 2000年5月8日,工程代号为 Kestrel 的 JDK 1.3发布,JDK 1.3 相对于 JDK 1.2 的改进主要表现在一些类库上(如数学运算和新的 Timer API 等),JNDI 服务从 JDK 1.3 开始被作为一项平台级服务提供(以前 JNDI 仅仅是一项扩展),使用 CORBA IIOP 来实现 RMI 的通信协议,等等。这个版本还对 Java 2D 做了很多改进,提供了大量新的 Java 2D API,并且新添加了 JavaSound 类库。
7) 2002年2月13日,JDK 1.4 发布,工程代号为 Merlin。JDK 1.4 是 Java 真正走向成熟的一个版本,Compaq、Fujitsu、SAS、Symbian、IBM 等著名公司都有参与甚至实现自己独立的 JDK 1.4。哪怕是在十多年后的今天,仍然有许多主流应用(Spring、Hibernate、Struts等)能直接运行在 JDK 1.4 之上,或者继续发布能运行在 JDK 1.4 上的版本。JDK 1.4 同样发布了很多新的技术特性,如正则表达式、异常链、NIO、日志类、XML 解析器和 XSLT 转换器等。
8) 2004年9月30日,JDK 1.5 发布,工程代号 Tiger。从 JDK 1.2 以来,Java 在语法层面上的变换一直很小,而 JDK 1.5 在 Java 语法易用性上做出了非常大的改进。例如,自动装箱、泛型、动态注释、枚举、可变长参数、遍历循环(foreach 循环)等语法特性都是在 JDK 1.5 中加入的。在虚拟机和 API 层面上,这个版本改进了 Java 的内存模型(Java Memory Model, JMM)、提供了 java.util.concurrent 并发包等。另外,JDK 1.5 是官方声明可以支持 Window 9x 平台的最后一个 JDK 版本。
9) 2006年12月11日,JDK 1.6 发布,工程代号 Mustang。在这个版本中,Sun 终结了从 JDK 1.2 开始已经有 8 年历史的 J2EE、J2SE、J2ME 的命名方式,启用 Java SE 6、Java EE 6、Java ME 6 的命名方式。JDK 1.6 的改进包括:提供动态语言支持(通过内置 Mozilla JavaScript Rhino 引擎实现)、提供编译 API 和微型 HTTP 服务器 API 等。同时,这个版本对 Java 虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的算法都有相当多的改动。
10) 在2006年11月13日的 JavaOne大会上,Sun 公司宣布最终会将 Java 开源,并在随后的一年多的时间内,陆续将 JDK 的各个部分在GPL v2(GNU General Public License v2) 协议下公开了源码,并建立了 OpenJDK 组织对这些源码进行独立管理。除了极少量的产权代码(Encumbered Code,这部分代码大多是 Sun 本身也无权限进行开元处理的)外,OpenJDK 几乎包括了 Sun JDK 的全部代码, OpenJDK 的质量主管曾经表示,在 JDK 1.7中,Sun JDK 和 OpenJDK 除了代码和文件头的版权只是之外,代码基本上完全一样,所以 OpenJDK 7 与 Sun JDK 1.7 本质上就是同一套代码库开发的产品。
11) JDK 1.7 的主要改进包括:提供新的 G1 收集器(G1 在发布时依然处于 Experimental 状态,直至2014年4月的Update 4中才正式庄正)、加强对非 Java 语言的调用支持(ISR-292,这项特性到目前为止依然没有完全实现定型)、升级类加载架构等。
12) 2009年4月20日,Oracle 公司收购了 Sun 公司,Java 商标从此正式归 Oracle 所有(Java 本身并不属于那间公司所有,他由 JCP 组织进行管理,尽管 JCP 主要是由 Sun公司或者说 Oracle 公司所领导的)。由于此前 Oracle 公司已经收购了另外一家大型的中间件企业 BEA 公司,在完成对 Sun 公司的收购之后, Oracle 公司分别送 BEA 和 Sun 中取得了目前三大商业虚拟机的其中两个:JRockit 和 HotSpot,Oracle 公司宣布在未来的1~2年的时间将把这两个优秀的虚拟机互相取长补短,最终合二为一。
1.4 Java 虚拟机发展史
1) Sun Classic / Exact VM
1996年1月23日,Sun 公司发布 JDK 1.0,Java 语言首次拥有了商用的正式运行环境,这个 JDK 中所带的虚拟机就是Classic VM。这款虚拟机只能使用纯解释器方式来执行 Java 代码,如果要使用 JIT 编译器,就必须进行外挂。但是假如外挂了 JIT 编译器,JIT 编译器就完全接管了虚拟机的执行系统,解释器变不再工作了。
其他类似的外挂编译器还有 Symantec JIT 和 shuJIT 等。由于解释器和编译器不能配合工作,这就意味着如果要使用编译器执行,编译器就不得不对每一个方法、每一行代码都进行编译,而无论他们执行的频率是否具有编译的价值。基于程序响应时间的压力,这些编译器根本不敢应用编译耗时稍高的优化技术,因此这个阶段的虚拟机即使用了 JIT 编译器输出本地代码,执行效率也和传统的 C/C++ 程序有很大的差距。
在 JDK 1.2 时,曾在 Solaris 平台上发布过一款名为 Exact VM 的虚拟机,他的执行系统已经具备现代高性能虚拟机的雏形:如两级即时编译器、编译器与解释器混合工作模式等。Exact VM 因它使用准确式内存管理(Exact Memory Management,也可以叫 Non-Conservative/Accurate Memory Management)而得名,即虚拟机可以知道内存中某个位置的数据具体是什么类型。由于使用了准确是内存管理,Exact VM 可以抛弃以前 Classic VM基于 handler 的对象查找方式(原因是进行 GC 后对象可能会被移动位置)。
虽然 Exact VM 的技术相对 Classic VM 来说先进了许多,但是在商业应用上只存在了很短暂的时间就被更为优秀的 HotSpot VM 所取代,甚至还没来得及发布 Windows 和 Linux 平台下的商用版本。而Classic VM 的生命周期则相对长了许多,他在 JDK 1.2 之前是 Sun JDK 中唯一的虚拟机,在 JDK 1.2 时,他与 HotSpot VM 并存,但默认使用的是 Classic VM(用户可用 java-hotspot 参数切换至 HotSpot VM),而在 JDK 1.3 时,HotSpot VM 称为默认虚拟机,但 Classic VM 仍作为虚拟机的备用选择发布(使用 java-classic 参数切换),知道 JDK 1.4 的时候,Classic VM 才完全退出商用虚拟机的历史舞台,与 Exact VM 一起进入了 Sun Labs Research VM 之中。
2) Sun HotSpot VM
Sun HotSpot VM 是 Sun JDK 和 Open JDK 中所带的虚拟机,也是目前使用范围最广的 Java 虚拟机,这个虚拟机最初是由一家名为 "LongviewTechnologies" 的小公司设计的,最初并非是为 Java 语言而开发的,他来源于 Strongtalk VM,而这款虚拟机中相当多的技术又是来源于一款支持 Self 语言实现 "达到 C 语言50% 以上的执行效率"的目标而设计实现的虚拟机, Sun 公司于1997年收购了 Longview Technologies 公司,从而获得了 HotSpot VM。
HotSpot VM 既继承了 Sun 之前两款商用虚拟机的优点,也有许多自己新的技术优势,如他名称中的 HotSpot 指的就是他的热点代码探测技术(其实两个 VM 基本上是同时期的独立产品,HotSpot 一开始就是准确式 GC,而 Exact VM 之中也有与 HotSpot 几乎一样的热点探测,为了 Exact VM 和 HotSpot VM 哪个称为 Sun主要支持的产品,在 Sun 公司内部还有过争论,HotSpot 打败 Exact VM 并不能算技术上的胜利),HotSpot VM 的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通过 JIT 编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和 OSR (栈上替换)编译动作。通过编译器和解释器恰当地协同工作,可以在最优化的程序相应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。
在2006年的 JavaOne 大会上,Sun 公司宣布最终会把 Java 开源,并在随后的一年,陆续将 JDK 的各个部分(其中当然也包括了 HotSpot VM)在 GPL 协议下公布了源码,并在此基础上建立了 OpenJDK。这样,HotSpot VM 便成为了 Sun JDK 和 OpenJDK 两个实现极度接近的 JDK 项目的共同虚拟机。
在2008年和2009年,Oracle 公司分别收购了 BEA 公司和 Sun 公司,这样 Oracle 公司同时拥有了两款优秀的 Java 虚拟机:JRockit VM 和 HotSpot VM。Oracle 公司宣布在不久的将来会完成这两款虚拟机的整合工作,使之优势互补。
3) Sun Mobile-Embedded VM/Meta-Circular VM
JVM--走进Java的更多相关文章
- 1. 走进java
走进java 1.java简介 1.1 java分类: 1.2 开发包JDK 1.3.一处编译,到处运行的特点 2. 配置开发环境 3. java基本语法 3.1关键字和保留字 3.2 标识符命名规则 ...
- 基础篇-1.1走进Java世界
在走进Java世界之前,我们势必先了解下Java是什么?Java是一门面向对象的编程语言,是静态面向对象编程语言的代表,极好得实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.Java具有 ...
- JVM之--Java内存结构(第一篇)
最近在和同事朋友聊天的时候,发现一个很让人思考的问题,很多人总觉得JVM将java和操作系统隔离开来,导致很多人不用熟悉操作系统,甚至不用了解JVM本身即可完全掌握Java这一门技术,其实个人的观点是 ...
- jvm系列:Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
- JVM垃圾收集(Java Garbage Collection / Java GC)
JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...
- JVM、Java编译器和Java解释器
作用: JVM:JVM有自己完善的硬件架构,如处理器.堆栈(Stack).寄存器等,还具有相应的指令系统(字节码就是一种指令格式).JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成 ...
- JVM(二):Java中的语法糖
JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法 ...
- Java Virtual Machine (JVM), Difference JDK, JRE & JVM – Core Java
By Chaitanya Singh | Filed Under: Learn Java Java is a high level programming language. A program wr ...
- JVM解毒——JVM与Java体系结构
你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重 ...
- JVM笔记-Java技术体系与JVM概述
1. 简述 Java 不仅仅是一门编程语言,还是一个由一系列计算机软件和规范组成的技术体系. Java 的广告词为 "一次编写,到处运行",之所以能够做到"跨平台&quo ...
随机推荐
- 一、VIP课程:互联网工程专题 03-Maven基本概念与核心配置
概要: maven 基本概念 maven 核心配置 一.maven 安装与核心概念 概要: maven 安装 maven 编译(compile) 执行测试用例(test) maven 打包 mave ...
- 第十三篇Django Logging配置样例
第十三篇Django Logging配置样例 阅读目录(Content) Django 日志配置模板 官方链接 Django Logging Django 日志配置模板 LOGGING = { 've ...
- 远程控制使用kill软件映射内网进行远程控制(9.28 第十四天)
1.能ping通IP情况下远程控制 设置kill软件中的端口.密码.上线列表 2.在软件的Bin\Plugins目录下找到Consys21.dll复制到/phpstudy/www目录下留作生成软件 3 ...
- POJ 2346:Lucky tickets
Lucky tickets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3247 Accepted: 2136 Des ...
- Java工程师面试题
1. J2EE 是什么?它包括哪些技术?解答:从整体上讲,J2EE 是使用 Java 技术开发企业级应用的工业标准,它是 Java 技术不断适应和促进企业级应用过程中的产物.适用于企业级应用的 J2E ...
- Linux 压缩解压操作
Linux 压缩解压操作 Linux解压文件到指定目录 tar在Linux上是常用的打包.压缩.加压缩工具,他的参数很多,折里仅仅列举常用的压缩与解压缩参数 参数:-c :create 建立压缩档案的 ...
- 2020/2/1 PHP代码审计之任意文件读取及删除漏洞
在开始学习之前先简单记录一下自己现在的思路吧..现在接触的基本都是无防护的漏洞也就是最简单的一些漏洞.我的想法就是以代审思路为主,之前一直在打CTF,白盒的思维我觉得和CTF这种黑盒有很大区别.自己的 ...
- redis(四)----发布订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合,也解决两者在物理部署上的耦合.废话不多说,直接 ...
- zabbix获取到的数值大于1000之后自动转换成1k
问题:zabbix在取到的值很大时会自动变成K,M,G 解决方法: 1.修改/var/www/html/zabbix/include/func.inc.php文件(这个文件不一定在这,自己find找下 ...
- Springboot过滤器注解简笔
对多个过滤的注解 @WebFilter(filterName="FirstFilter",urlPatterns={"*.do","*.js ...