JVM基础学习,主要参考:陈树义JVM基础 ,并总结归纳
开篇:为什么要学虚拟机?
- 学习 Java 虚拟机能深入地理解 Java 这门语言
深入到字节码层次才能深入研究java细节,字节码 ==》 虚拟机的一部分 - 学习虚拟机是为线上排查问题打下基础
除去网络、系统本身问题,很多时候 Java 应用出现问题,就是 Java 虚拟机的内存出现了问题。要么是内存溢出了,要么是 GC 频繁导致响应慢等等。 ==》得懂 GC 日志
第1讲:Java 语言的前世今生
JRE、JDK、J2SE、Java SE 与 Java SE
JRE | JDK | J2SE | Java SE | Java SE |
---|---|---|---|---|
Java运行环境 | Java 开发工具包 | Java 2 标准版技术体系 | Java 2 企业版技术体系 | Java 2 嵌入式技术体系 |
Java Runtime Environment | Java Development Kit | Java 2 Standard Edition | Java 2 Enterprise Edition | Java 2 Micro Edition |
仅包含运行 Java 程序的必需组件,包括 Java 虚拟机以及 Java 核心类库等 | JRE + 一系列开发、诊断工具 (即一个核心库、开发工具、诊断工具的合集) | JDK +,包含构成 Java 语言核心的类,例如:数据库连接、网络编程、接口定义等。 | J2SE 中的类 +,还包含用于开发企业级应用的类,比如:Servlet、JSP、EJB 等。 | 包含 J2SE 中的类(SE/EE/ME都是技术体系) |
仅运行Java程序 | 开发Java程序 | 桌面应用软件的编程 | 分布式的网络程序的开发,如电子商务网站等 | 主要用于消费类电子产品的软件开发,例如:手机、PDA、寻呼机等。 |
Java 历史
在 1991 年,James Gosling 博士发布了 Oak,这个是 Java 语言的前身。但一直到 1995 年的时候,Oak 语言才改名为 Java。
年份 | 版本 | 不同 |
---|---|---|
1991 | 前身 | James Gosling 博士发布产品 Oak |
1995 | Java | Oak 语言改名为 Java |
1996 | JDK1.0 | 提供了纯解释执行的 Java 虚拟机实现:Sun Classic VM |
1997 | JDK1.1 | 新增了JDBC、JavaBeans、内部类、反射 |
1998 | JDK1.2 | Java 技术体系被拆分为 J2SE、J2EE、J2ME 三大体系 |
2000 | JDK1.3 | 默认的 Java 虚拟机由 Sun Classic VM 改为 HotSopt |
2002 | JDK1.4 | 新增了正则表达式、NIO等 Java 真正走向成熟 |
2004 | JDK1.5 | 对语法易用性做了很大改进,新增了泛型、枚举等,代表技术:并发包等 |
2006 | JDK1.6 | 将 J2EE/J2SE/J2ME 的命名方式改为 Java SE 6、Java EE 6、Java ME 6 |
2009 | - | Sun 公司因为经营不善被 Oracle 公司收购 |
2011 | JDK1.7 | JDK1.7、JDK1.8 新特性(全) |
2013 | JDK1.8 | JDK1.7、JDK1.8 新特性(全) |
粗略总结:
- jdk1.5 新特性
- foreach循环
- 自动装拆箱:基本数据类型和他的包装类自动转换,Integer.valueOf Integer.intvalue;
- 泛型:其实是类型擦除,编译完类型就没了,执行方法又回到了原来的类型强转
- 可变参数
- jdk1.7 新特性
- 可以通过[], {}的形式向集合内添加元素
- switch 支持string类型数据
- jdk1.8 新特性
- 接口可用default关键字添加非抽象方法
- lambda表达式:以前java集合是不能够进行内部迭代的,只能用循环外部迭代==》lambda来了
- 函数式接口:指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。(每一个lambda表达式都对应一个类型,通常是接口类型)。jdk1.8提供了一个@FunctionalInterface注解来定义函数式接口,如果我们定义的接口不符合函数式的规范便会报错。jdk1.8新特性总结
- 方法与构造函数引用:Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:converter = something::startsWith; (不常用,不懂啊。。)
- 定义可重复的注解:在Java 5中使用注解有一个限制,即相同的注解在同一位置只能声明一次。Java 8引入重复注解,这样相同的注解在同一地方也可以声明多次。重复注解机制本身需要用@Repeatable注解。Java 8在编译器层做了优化,相同注解会以集合的方式保存,因此底层的原理并没有变化。
- 流等等…
第2讲:Java 虚拟机的历史
JDK 版本升级不仅仅体现在语言和功能特性上,还包括了其编译和执行的 Java 虚拟机的升级。
- 1996 年,JDK 1.0 发布时,提供了纯解释执行的 Java 虚拟机实现:Sun Classic VM。
- 1997 年,JDK 1.1 发布时,虚拟机没有做变更,依然使用 Sun Classic VM 作为默认的虚拟机。
- 1998 年,JDK 1.2 发布时,提供了运行在 Solaris 平台的 Exact VM 虚拟机,但此时还是用 Sun Classic VM 作为默认的 Java 虚拟机。
- 2000 年,JDK1.3 发布,默认的 Java 虚拟机由 Sun Classic VM 改为 Sun HotSopt VM,而 Sun Classic VM 则作为备用虚拟机。
- 2002 年,JDK 1.4 发布,Sun Classic VM 退出商用虚拟机舞台,直接使用 Sun HotSpot VM 作为默认虚拟机一直到现在。
从 Sun Classic、Sun Exact VM、Sun HotSpot VM,再到 BEA JRockit、IBM J9 VM,这几个虚拟机可以说是虚拟机的正史了,最后的赢家:Oracle。
在 2010 年,Oracle 公司收购了 Sun 公司,这样 Oracle 就拥有了 HotSpot VM。再加上其在 2008 年收购 BEA 公司获得的 JRocket VM,Oracle 公司就拥有了地球上最优秀的两款虚拟机。Oracle 还宣布会将 JRockit 的优秀特性整合到 HotSpot VM 中,例如移植 JRockit 的垃圾回收器和 MissionControl 服务。
第3讲:到底什么是虚拟机?
与其他语言不同,Java 语言并不直接将代码编译成与系统有关的机器码,而是编译成一种特定的语言规范,这种语言规范我们称之为字节码。无论 Java 程序要在 Windows 系统,还是 Mac OSX 系统,抑或是 Linux 系统,它首先都得编译成字节码文件,之后才能运行。
但即使编译成字节码文件了,各个系统还是无法明白字节码文件的内容,这时候就需要 Java 虚拟机的帮助了。Java 虚拟机会解析字节码文件的内容,并将其翻译为各操作系统能理解的机器码。