java系列之jvm结构简介

JVM简介 

一.介绍:

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

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


二.结构:

java系列之jvm结构简介_第1张图片

Tips: jvm相当于一个新的系统级软件

  1. 可以高效管理os分配的内存,Garbage collertorheap中的内存进行管理:清除,整合,复制

  2. 自行调度jvm中的各种线程给cpu运行,program counter registerjava threads配合进行多线程调度。

  3. Native internal threads可以根据不同的os,调用不同的系统api(这也是java程序能跨平台的主要原因,感谢下jdk的维护人员)

  4. Jit Compiler可以把常用的.class文件编译成本地系统的的二进制文件,加快加载和运行速度。

    特点

2.1 Class Loader Subsystem :java编译的class文件加载器.

                主要用来将*.class文件读取到jvm的内存中(就是方法区)

2.2 Runtime Data Areas :允许时数据存储区

               里面的不同部分都是用来保存java程序运行时的程序信息<数据+指令>

2.2.1 Method area:方法区(jdk1.8 取消了方法区合)

     class文件加载器加载了*.class文件后,这个文件的 信息,常量,静态变量,即时编译后(jit)的代码.

             a.特点:线程共享(由于保存的都是一些不可变信息)

             b.保存信息格式:  

                  1)     类(文件)class:

                        a.       类及其父类全限定名          (java.lang.Object没有父类)

                        b.      类的类型                                                 class 、 interface

                        c.       修饰符                                                     public、protected、private

                        d.      实现接口的全限定名的列表                     实现的接口列表

                        e.       常量池(final staic)                     主要:string(使用final staic char[]实现的)||emun

                        f.        字段信息

                        g.       方法信息

                        h.      出常量外的静态变量                               staticmethod,class

                        i.         Classloader引用

                        j.        Class 引用

                        Tips:全限定名:完整的class地址  Eg:在org.spring.web包下的annotation.class其权限名:org.spring.web. annotation.class

                

                    2)      字段field:

                        a.       字段名

                        b.      字段类型                                              类型使用全限定名

                        c.       字段修饰符                                           基本类型和对象

                        a)        访问修饰:                                           public、private、protected

                        b)        静态:                                                  static

                        c)         常量:              final

                        d)        Jndi:              transient              

                        e)         线程:              volatitile

                  3)   方法method:

                        a)         方法名:                                           全限定名

                        b)        返回类型:            全限定名

                        c)         参数信息:            参数列表:由全限定名

                        d)        修饰符:

                        a)         访问修饰:                                           public、private、protected

                        b)        静态:              static

                        c)         常量:              final

                        d)        线程:               synchronized

                        e)         本地:                                                native

                        f)          抽象:                                                   abstract

                                            如果不是nativeabstract还会保存一下信息

                                            1.         方法的字节码

                                            2.         本变量表和操作数栈的大小

                                            3.         异常表

         c.String常量池:

    

2.2.2 Heap

             存放数组对象实例(new)的地方,gc的主要区域。

    主要分区

名称 个数 大小比(default)
年轻代 1 4
年老代 1 1

    

    年轻代

名称 个数 大小(default)
eden区 1 8
survivor区 2 2

         

    直接内存:

              调用本地库来操作分配系统的内存

    对象访问:

              这是堆的主要功能,每次new都会分配一个对象大小的内存空间。并且在java栈中有一个这个对象的引用。还可以通过这个引用查找存放在method area区的对象文件(.class)的所有信息<也就是其类的信息>。

             Reference在Java虚拟机中定义为指向对象的引用

             1.一种实现是Reference直接存储对象在堆内的地址,对象的类型信息可以在对象在堆中的内存布局中存储,如存储在对象内存的开头等。

    2.另一种实现是Reference指向一个句柄表中的一个位置,句柄中保存了对象的实际位置及它对应的类型信息。使用句柄的好处是当在内存中移动对象的位置时,只需要更新句柄表中的内容,不需要改变引用值,但会多一次内存访问开销,直接引用的优缺点与此相反。

2.2.3  Native method stack:本地方法栈

             执行本地方法。

        例如:系统的文件系统,系统的网络系统。

2.2.4 Program counter regsiters:程序计数器

            类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined

    java系列之jvm结构简介_第2张图片

    

2.2.5 Java stack:虚拟机栈

    虚拟机栈也是线程私有的,创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。

       如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常

    每一个线程都会

    栈帧:

       1.局部变量区

        局部变量区被组织一个一个从0开始的字数组,byteshortchar在存储前被转换为intboolean也被转换为int0表示false,非0表示truelongdouble占据两个字长。

       2.操作数栈

        操作数栈也被组织为一个字数组,但不同于局部变量区,它不是通过数组下标访问的,而是能过栈的PushPop操作,前一个操作Push进的数据可以被下一个操作Pop出来使用。

       3.栈数据区

                    a)         常量池中的数据解析

                    b)        方法执行完后处理方法返回,会恢复调用方法现场

                    c) 方法执行过程中抛出异常时的异常处理,存储有一个异常表,当出现异常时虚拟机查找相应的异常表看是否有对应的Catch语句,如果没有就抛出异常终止

      java系列之jvm结构简介_第3张图片

2.3  Execution Engine 运行引擎

             JIT Compiler: just-in-time Compiler及时编译

             Garbage Collector:垃圾回收

三.JVM运行

        这里非常粗糙的模拟下jvm的运行方式

java系列之jvm结构简介_第4张图片

你可能感兴趣的:(jvm)