分享

11

 rongq2007 2021-01-18

历史上的原因是,OpenJDK是JDK的开放原始码版本,以GPL(General Public License)协议的形式放出(题主提到的open就是指的开源)。在JDK7的时候,OpenJDK已经作为JDK7的主干开发,SUN JDK7是在OpenJDK7的基础上发布的,其大部分原始码都相同,只有少部分原始码被替换掉。使用JRL(JavaResearch License,Java研究授权协议)发布。至于OpenJDK6则更是有其复杂的一面,首先是OpenJDK6是JDK7的一个分支,并且尽量去除Java SE7的新特性,使其尽量的符合Java6的标准。


Java虚拟机规范

根据定义,JVM是虚拟机。即一个模拟真机操作的软件机器。像真机一样,它有一个指令集,一个虚拟计算机架构和一个执行模型。它能够运行用这个虚拟指令集编写的代码,就像真机可以运行机器代码一样。

HotSpot 是JVM概念的一个实现。它最初由Sun开发,现在由Oracle拥有。 JVM规范还有其他实现,例如 JRockit , IBM J9 等等。


jdk的发展史

1995年5月:Oak——>jdk1.0    write Once run anyWhere

1996年1月:jdk1.0   jvm   classicVM

1996年9月:首届javaOne大会

1997年2月:jdk1.1   内部类   反射   jar文件格式   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,Spring1.X基于配置文件   正则表达式   Nio   日志   Xml解析器

2004年9月:jdk1.5   tiger:自动装箱拆箱,泛型,注解,枚举,变长参数,增强for循环……  Spring2.X 注解配置

2006年4月:jdk1.6   javaSe   javaEE   javaMe   jdk6    提供了脚本语言支持、编译API、http服务器API

2011年7月: jdk1.7   Oracle收购sun公司74亿美元

2014年3月:jdk8  lanbda表达式    接口新增默认方法与静态方法   新增了四个重要的函数式接口:函数形接口 、供给形接口、消费型接口、判断型接口

2017年9月:jdk9   jshell   统一jvm日志系统   javadoc对HTML5的支持   目录结构   ……

2018年3月:jdk10

2018年9月:jdk11

2019年2月:jdk12

2019年9月:jdk13

--------------------------------------------------------------------------------------------

SUN的JDK版本从1.3.1开始运用HotSpot虚拟机, 2006年底开源,主要使用C++实现,JNI接口部分用C实现。
    HotSpot是较新的Java虚拟机,用来代替JIT(Just in Time),可以大大提高Java运行的性能。 
    Java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢。而HotSpot将常用的部分代码编译为本地(原生,native)代码,这样显着提高了性能。 

编译器:java源代码被编译器编译成class文件(字节码),java字节码在运行时可以被动态编译(JIT)成本地代码.

解释器: 解释器用来解释class文件(字节码),java是解释语言(书上这么说的)。

-------------------------------------------------------------------------------------------\

JDK从1.5版本开始,在官方的正式文档与宣传资料中已经不再使用类似“JDK1.5”的名称,只有程序员内部使用的开发版本号才继续沿用1.5,1.6,1.7的版本号,而且公开版本号则改为JDK5, JDK6, JDK7,为了行文一致,本书所有场合统一采用开发版本号的命名方式。

--------------------------------------------------------------------------------------------

i++ 和 ++i 的区别:

  1. i++:从局部变量表取出 i 并压入操作栈(load memory),然后对局部变量表中的 i 自增 1(add&store memory),将操作栈栈顶值取出使用,如此线程从操作栈读到的是自增之前的值。

  2. ++i:先对局部变量表的 i 自增 1(load memory&add&store memory),然后取出并压入操作栈(load memory),再将操作栈栈顶值取出使用,线程从操作栈读到的是自增之后的值。

之前之所以说 i++ 不是原子操作,即使使用 volatile 修饰也不是线程安全,就是因为,可能 i 被从局部变量表(内存)取出,压入操作栈(寄存器),操作栈中自增,使用栈顶值更新局部变量表(寄存器更新写入内存),其中分为 3 步,volatile 保证可见性,保证每次从局部变量表读取的都是最新的值,但可能这 3 步可能被另一个线程的 3 步打断,产生数据互相覆盖问题,从而导致 i 的值比预期的小。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多