一、走进Java (快速浏览,先略过)
1.1 概述
Java不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范组成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统。
1.2 Java优点
- 拥有一门结构严谨、面向对象的编程语言。
- 摆脱了硬件平台的束缚,实现了一次编写,到处运行的理想。
- 提供了相对安全的内存管理和访问机制,避免了大部分的内存泄露和指针越界问题。
- 实现了热点代码检测和运行时编译及优化,使得Java应用能随着运行时间的增长而获得更高的性能。
- 拥有一套完善的应用程序接口,和无数来自商业机构和开源社区的第三方类库来帮助用户实现各种各样的功能
- ...
1.3 Java技术体系
- Java程序设计语言
- 各种硬件平台上的Java虚拟机实现
- Class文件格式
- Java类库API
- 来自商业机构和开源社区的第三方Java类库
JDK:
是Java程序设计语言、Java虚拟机、Java类库的统称,是用于支持Java程序开发的最小环境。
JRE:
是Java类库API中JavaSE API子集和Java虚拟机这两部分的统称,JRE是支持Java程序运行的标准环境。
JVM:
Java虚拟机,Java能跨平台运行的重要支持。
Java按照技术关注的重点业务来划分,可分为以下4条主要的产品线
Java Card
Java ME
Java SE
Java EE
1.4 Java发展史
1.5 Java虚拟机家族
- 虚拟机始祖:Sun Classic/Exact VM,世界上第一款商用Java虚拟机
- 武林盟主:HotSpot VM,Sun/OracleJDK 和OpenJDK中默认的Java虚拟机,也是目前使用最广的Java虚拟机。
- 小家碧玉:Mobile/Embedded VM,Sun/Oracle研发的专门面对移动和嵌入式市场的Java虚拟机
- 天下第二:BEAJRockit/ IBM J9 VM
- 软硬联合: BEA Liquid VM / Azul VM
- 挑战者:Apache Harmony/ Google Androd Dalvik VM
- ...
1.6 展望Java技术的未来
- 无语言倾向:Graal VM
- 新一代即时编译器
- 向Native迈进
- 灵活的胖子:模块化
- 语言语法持续增强
二、Java运行时内存区域
概述
对于Java程序员来说,在JVM自动内存管理机制的帮助下,不需要再为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出的问题,不过,也正是因为Java程序员把控制内存的权力交给了JVM,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误、修正问题就会成为一项异常艰难的工作。
Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK 1.8 和之前的版本略有不同,下面会介绍到。
JDK 1.8 之前:
JDK 1.8 :
2.1 程序计数器
概述:
是一块较小的内存空间,可以看作当前线程所执行的字节码的一个行号指示器,在Java虚拟机的概念模型里面,字节码解释器工作的时候,就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,即字程序计数器里面存的值是当前线程所需要执行的下一条指令的地址。
程序计数器是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖程序计数器来完成。
在JVM中多多线程的执行机制是通过线程轮流切换、分配处理器执行时间等方式即时间片轮转的方式来实现的,在任何一个确定的时间,一个处理器都只执行一个线程中的指令,因此,为了线程切换后每个被中断的线程能够恢复到被中断前的执行位置,每个线程都需要一个独立的程序计数器来记录线程信息,各条线程之间的计数器互不影响、独立存储。
作用:
1.是记住下一条jvm指令的执行地址,是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖程序计数器来完成。
2.在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
特点:
1.线程私有:每个线程都有对应的程序计数器,互不影响。
2.是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域,即不会有内存溢出的情况。它的生命周期随着线程的创建而创建,随着线程的死亡而死亡。