1、JDK的基本概念
我们可以把Java程序设计语言、Java虚拟机、 Java API类库这三部分统称为JDK( Java Development Kit),JDK是用于支持Java程序开发的最小环境。另外,可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE( Java RuntimeEnvironment),JRE是支持Java程序运行的标准环境。
2、JVM的基本原理
JVM是在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。JVM运行原理java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
JVM执行程序的过程 :I.加载.class文件II.管理并分配内存III.执行垃圾收集JRE(java运行时环境)包含JVM的java程序的运行环境
JVM是Java程序运行的容器,但是它同时也是操作系统的一个进程,因此它也有它自己的运行的生命周期,也有自己的代码和数据空间。JVM在整个jdk中处于最底层,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也叫虚拟计算机。
操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境。1.创建JVM装载环境和配置2..装载JVM.dll 3.初始化JVM.dll并挂接到JNIENV(JNI调用接口)实例4.调用JNIEnv实例装载并处理class类。(JVM运行原理如下图)
JVM实例对应了一个独立运行的java程序,它是进程级别;JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别的。
JVM的生命周期:(1)JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点。
(2)JVM实例的运行main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程。
(3)JVM实例的消亡:当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。
3、JVM结构
JVM的内部体系结构中各部分的主要功能:
- 类加载器:JVM启动,程序开始执行时,负责将class字节码加载到JVM内存区域中
- 执行引擎:负责执行class文件中包含的字节码指令
- 本地方法库:主要是调用C或C++实现的本地方法及返回结果
- 运行时数据区:方法区、java堆、java栈、本地方法栈和程序计数器。
(1)方法区(线程共享的)
用于存储类结构信息的地方,包括类信息、常量池、静态变量、构造函数以及即时编译器编译后的代码等数据
(2)java堆(线程共享的)
存储java对象实例。java堆是Java虚拟机所管理的内存中最大的块。同时也是GC(垃圾回收机制)处理的的主要区域。
(3)java栈((线程私有的)
java栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的java栈。在这个java栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值、动态链接等。每一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。所以java栈是现成私有的。
(4)程序计数器(线程私有的)
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
(5)本地方法栈(线程私有的)
和java栈的作用差不多,只不过是为JVM使用到的native方法服务的。
4、JVM类加载机制
类加载器图: