JVM讲解(一)

一、JVM的历史和背景

二、JVM的执行过程

     JVM在整个JDK中处于在最底层,负责与操作系统交互,用来屏蔽操作系统环境,提供一个完整的java程序运行环境。操作系统装入JVM是通过jdk中Java.exe来完成的,通过以下四个步骤完成JVM环境的执行 1)、创建JVM装在环境和配置,2)、装载JVM.dll 3)、初始化JVM.dll并获得JNIENV接口4)、调用JNIEnv实例装载并找到类的Main()方法去处理。如下图所示:

185244_2iWO_1421591.jpg

三、JVM的基本结构

    1、类装载器 (classLoader,用来装载.class文件)

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

     3、内存空间(方法区、java堆、java栈,本地方法栈)

     4、PC寄存器 (用于存储每个线程下一步将执行的JVM指令)

     5、垃圾回收器

     内存空间和PC寄存器组成了运行时数据区。如下图所示:

190456_gibN_1421591.jpg


        运行时数据区讲解:

            1、PC寄存器

                    每个线程拥有一个寄存器

                    在线程创建时创建

                    用于存储每个线程下一步将执行的JVM指令

                    执行native方法时,则PC寄存器不存储任何信息,值为undefined

             2、方法区域(method Area)

                    在JDK中这块区域和永久区(PermanetGeneration)关联起来,又叫持久代

                    保存类装载信息(名称、修饰符等)、类中的静态变量(static修饰)、final修饰的常量、字段(field)x  信息、方法(method)信息。

                    方法区域是全局共享的,在一定条件下也会被垃圾回收机制回收(GC)

                    方法区内存超出允许大小,会跑出内存溢出(OutOfMemory)错误

                3、java堆

                    存储对象的实例和数组值的区域,可以认为所有通过new创建的对象都需要在Java堆内存中分配。

                    GC主要是对堆Heap内存进行回收。

                    所有线程共享java堆,所以在堆上进行对象分配内存都需要加锁,所以创建对象比较耗时的。

                    

                Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配

                 TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。

                   所有创建的对象都会存储在新生代对内存中(Yong Generation),如果Yong Generation 在多次的垃圾回收中(GC在)中存活了下来,这些内存信息将被转移到Old Generation 中

                    新的对象总是创建在Eden Space

                    堆上分配的空间,每次需要GC 清理空间

195221_z72B_1421591.png

                      4、java栈

                            线程私有

                             栈由一系列的帧组成(java栈也叫做帧栈),帧上保存一个方法的局部变量、操作数栈、常量池指针

                              栈中存放的基本类型的变量,以及部分返回结果和stack Frame,非基本类型的对象在JVM栈上存放的是一个指向JVM堆上地址。

                            栈上分配的内存空间,函数(方法)调用完后自动释放



转载于:https://my.oschina.net/u/1421591/blog/659970

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值