jvm介绍

来源:互联网 发布:热血征途2008java 编辑:程序博客网 时间:2024/06/05 08:36

1.什么事jvm?

JVM是java Virtual Machine(java虚拟机)缩写,jvm是一种用于计算机设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。java虚拟机包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,使java程序只需要生成在java虚拟机上运行的目标代码,就可以在多种平台上不加修改地运行。jvm在执行字节码时,实际上最终就是把字节码解释成具体平台上的机器指令执行。

java语言的一个非常重要的特点就是与平台无关性。而使用java虚拟机是实现这一特点的关键。一般高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入了java虚拟机后,java语言在不同平台上运行时不需要重新编译。java语言使用java虚拟机屏蔽了与具体平台相关的信息,使得java语言编译程序只需生成在java虚拟机上运行的目标代码,就可以在多种平台上不加修改地运行。java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行,这就是java能够一次编译,到处运行的原因

2.jre/jdk/jvm 是什么关系?

jre(java运行环境),也就是java平台。所有java程序都要在jre下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可

jdk是程序开发者用来编译,调试java程序用的开发工具包。jdk的工具也是java程序,也需要jre才能执行,为了保持jdk的独立性和完整性,在jdk的安装过程中,jre也是安装的一部分,所以,在jdk的安装目录下有一个名为jre的目录,用户存放jre文件

jvm是jre的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,jvm有自己完善的硬件架构,如处理器,堆栈,寄存器等,

还有相应的指令系统,java语言最重要的特点就是跨平台运行,使用jvm就是为了支持与操作系统无关

3.jvm原理

jvm是java的核心和基础,在java编译器和ios平台之间的虚拟处理器,它是一种利用软件方法实现的抽象计算机基于下层的操作系统和硬件平台,可以在上面运行自字节码程序


java编译器只要面向jvm,生成jvm能理解的代码或字节码文件,java源文件经编译成字节码程序,通过jvm将每一条指令编译成不同平台机器,通过特定的平台运行

4.jvm执行程序的过程

1)加载class文件 2)管理并分配内存 3)执行垃圾收集

JRE(java运行环境)由jvm构造的java程序的运行环,也是java程序运行的环境,但是他同时一个系统的一个应用程序,因此它也有他自己的生命周期

也有自己的代码和数据空间,jvm在整个jdk处于最底层,负责于操作系统的交互,用户屏蔽操作系统环境,提供一个完整的java运行环境,因此也就虚拟机

5.jvm的生命周期

1)jvm实例对应了一个独立运行的java程序,它是进程级别

a)启动。启动一个java程序时,一个jvm实例就产生了,任何一个拥有public static void main(String[] args[])函数的class都可以作为jvm实例运行的起点

b)运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。jvm内部有2中线程:守护线程和非守护线程。main()属于非守护线程。守护线程是jvm自身使用,java程序也可以表明自己创建的线程是守护线程

c)消亡。当程序中的所有非守护线程终止时,jvm才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出

2)jvm执行引擎实例则对应了属于用户执行程序的线程它是线程级别的

6. JVM的体系结构
.类加载器(用来装载.class文件)

.执行引擎(执行字节码,或者执行本地方法)

.运行时数据区(方法区.堆.java栈.pc寄存器.本地方法栈)

7. JVM运行时数据区

第一块:pc寄存器

pc寄存器是用于存储每个线程下一步执行的jvm指令,如方法是native的,则pc寄存器中不存储任何消息

第二块:jvm栈

jvm栈是线程私有的,每个线程创建的同时都会创建jvm栈,jvm栈中存放的为当前线程中局部基本类型变量(java中定义了八种基本类型:boolean.char.byte.short.int.short.int.long.float.double) ,

第三块:堆(Heap)

它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。


(1) 堆是jvm中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销比较大的

(2)所有创建的object都将会存储在新生代yong generation 中,如果yong generation 的数据在一次或多次GC后存活下来,那么将会转转移到OldGeneration。新的Object总是创建在Eden Space

第四块:方法区域

(1)在sun jdk这块区域对应的称为持久代

第五块:运行时常量池(Runtime Constant Pool)

存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。

第六块:本地方法堆栈(Native Method Stacks)

JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

8. JVM垃圾回收

GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

(1)对新生代的对象的收集称为minor GC;

(2)对旧生代的对象的收集称为Full GC;

(3)程序中主动调用System.gc()强制执行的GC为Full GC。

不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)

(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)

(3)弱引用:在GC时一定会被GC回收

(4)虚引用:由于虚引用只是用来得知对象是否被GC


 

0 0