Java简介
1. java发展史
-
起源
java的诞生还是比较戏剧性的,一开始在1990末,Sun公司为了抢占市场,在 1991 年成立了一个由詹姆斯·高斯林(James Gosling)领导, 名为“Green”项目小组,目的是开发一种能够在各种消费性电子产品上运行的程序架构。
一开始考虑的是使用C++语言,想在C++基础上开发一种面向对象的环境,后来放弃了创建了Oak语言,最后对Oak进行了小规模的改造,小组中的Naughton和Jonathan Payne完成了第一个Java语言的网页浏览器被实验室主任以及技术总监认可,将Oak改名为Java
Sun公司在1995年年初发布了Java语言,Sun公司直接把Java放到互联网上,免费给大家使用,甚至连源代码也不保密,也放到互联网上向所有人公开。
2. Java体系与特点
2.1 体系
- JAVA被分为3种结构独立但又彼此依赖的技术体系分支:
Java SE(标准版)
、Java EE(企业版)
、Java ME(精简版)
。以上三种体系分支分别对应着不同的规范集合和组件:Java SE
活跃在桌面领域,主要包含Java API组件;Java EE
活跃在企业级领域,除了包含Java API组件,还扩充有Web组件、事务组件、分布式组件、EJB组件、消息组件;Java ME
则活跃在嵌入式领域,仅保留部分Java API组件以及适应设备的特有组件,这也是它“精简版”称呼的由来。
2.2 特点
java不可忽视的特点:
- 结构严谨、面向对象的编程语言
- 跨平台、可移植
- 安全性强
- 多线程
- 分布式
- 大量第三方库支持
3. 理解JDK、JRE、JVM
JDK: (Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个JRE目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM和 lib合起来就称为JRE。
JRE:(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)。
JVM: (Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,这也是为什么Java能实现跨平台的原因,正是因为有JVM当万能的翻译器,能模仿在各种计算机中实现功能,也是Java的核心技术机制。
由图可以看出:JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。
三者联系: JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM和 lib合起来就称为JRE。JVM+Lib=JRE。总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
三者区别:
JDK和JRE区别
:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。
JRE和JVM区别
:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。
-
Java跨平台原理:
-
Java从编译到执行):
-
JVM 可以理解成一个可运行 Java 字节码的虚拟计算机系统
它有一个解释器组件,可以实现 Java 字节码和计算机操作系统之间的通信,对于不同的运行平台, 有不同的JVM。
JVM工作图:
JVM整个类加载过程的步骤:加载、连接、初始化。
- 加载
加载二进制数据到内存 —> 映射成jvm能识别的结构 —> 在内存中生成class文件。
- 连接
链接是指将上面创建好的class类合并至Java虚拟机中,使之能够执行的过程,可分为验证、准备、解析三个阶段。
1.验证
确保class文件中的字节流包含的信息,符合当前虚拟机的要求,保证这个被加载的class类的正确性,不会危害到虚拟机的安全
2.准备
为类中的静态字段分配内存,并设置默认的初始值.
3.解析
解析阶段的目的,是将常量池内的符号引用转换为直接引用的过程.如果符号引用指向一个未被加载的类,或者未被加载类的字段或方法,那么解析将触发这个类的加载
- 初始化
初始化就是执行类的构造器方法init()的过程。
JVM运行时数据区:
第一块:PC寄存器
PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。
第二块:JVM栈
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址
第三块:堆(Heap)
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
第四块:方法区域(Method Area)
(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
第五块:运行时常量池(Runtime Constant Pool)
存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。
第六块:本地方法堆栈(Native Method Stacks)
JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。