Java简介

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方法调用的状态。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

12点前就睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值