JVM

来源:互联网 发布:etcd raft 源码阅读 编辑:程序博客网 时间:2024/06/06 10:05

什么是jvmjvm的工作原理?

JVM

jvmjava virtual machinejava虚拟机),jvm是一种用于计算机设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆、一个存储方法域。jvm屏蔽了与具体操作系统平台相关的信息,使java程序只需生成在java虚拟机上运行的字节码,就可以在多种平台上不加修改的运行。jvm执行字节码时,实际上最终还是把字节码解释成了具体平台上的机器指令来执行。java语言的一个最重要的特点就是与平台无关性。而使用java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入java虚拟机之后,java代码在不同平台上运行时不需要重新编译。java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令来执行。这就是java能够“一次编译,到处执行”的原因。

 

工作原理:

jvm原理:

jvmjava的核心和基础,是介于java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的基于底层操作系统和硬件平台的抽象计算机,可以在上面执行java的字节码程序。java编译器只需要面向jvm,生成jvm能够理解的字节码文件。Java源文件经编译成字节码程序,通过jvm将每一条指令解释成不同平台机器码,通过特定平台运行。

   

JDK/JRE/JVM的关系

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

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

JVM(JavaVirtualMachineJava虚拟机)JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

 

jvm执行程序的过程:

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

JREjava运行时环境)由JVM构造的java程序的运行环境,jre同时还是操作系统的一个应用程序进程,因此他也有自己的运行周期,也有自己的代码和数据空间。JVM在整个jdk中处于最底层,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境。操作系统装入JVM是通过jdkJava.exe来完成,通过下面4步来完成JVM环境:1、 创建JVM装载环境和配置2、装载JVM.dll  3、初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例4、调用JNIEnv实例装载并处理class类。

 

Jvm的生命周期

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

1、 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void

main(String[] args)函数的class都可以作为JVM实例运行的起点

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

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

 

JVM的体系结构


 

类加载器(ClassLoader)(用来加载.class文件)

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

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

 

JVM垃圾回收

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

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

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

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

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

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

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

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

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

 

参考:

http://baike.baidu.com/link?url=9xDWtFsYUvCWCuRrX7nHM88nLSrQMaZ54MEZh2ykAo8-N80M0k5nuATM8v60YSGd6iQ1MOD_AZJ1_oyhd7zsVq

0 0