JVM内存模型概述

一、虚拟机内存模型

 

  1、线程私有的数据区

    线程私有的数据区包括程序计数器、虚拟机栈和本地方法栈三个区域,

    a.程序计数器

      当线程数超过CPU数量或CPU内核数量时,线程之间就要根据时间片就要根据时间片轮询抢夺cpu时间资源,因此 为了线程切换后能恢复到正确执行位置,每条线程都需要独立的计数器去记录其正在执行的字节码指令地址。程序计数器是线程私有的一块较小的内存空间,其可以看做是当前线程所执行的字节码的行号指示器,如果线程正在执行的是Java方法,计数器记录的是正在执行的字节码指令的地址;如果正在执行的是Native方法,则计数器的值为空。程序计数器是唯一一个没有规定任何OutOfMenoryError的区域

    b.虚拟机栈

      拟机栈的描述的是Java方法执行的内存模型,是线程私有的。每个方法在执行的时候都会创建一个栈桢,用于存储局部变量表,操作数栈,动态链接,方法出口等信息,而且每个方法从调用到直至完成的过程,对应一个栈桢在虚拟机栈中入栈出栈的过程,其中,局部变量表主要存放一些基本类型的变量,和对象句柄,它们可以使方法参数,也可以是方法的局部变量。虚拟机栈有两种异常情况:StackOverflowError和OutofMemoryError,

     c.本地方法栈

        本地方法栈与Java虚拟机栈非常相似,也是线程私有的,区别是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈为虚拟机执行的Native方法服务(一个Native Method就是一个Java调用非Java代码的接口,一个Native Method是这样一个Java的方法:该方法的实现是由非Java语言实现的,例如 c

  2、线程共享的数据区

    线程共享的数据区具体包括Java堆和方法区两个区域,

     a、Java堆

        Java堆的唯一目的就是存放对象实例,几乎所有的对象实例(和数组)都在这里分配内存。Java堆是线程共享的,类对象从中分配空间,这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显示的释放。Java堆的目的就是用来存放对象实例的,因此其也是垃圾收集器管理的主要区域,故也称为GC堆。

     b、方法区

        方法区和Java堆一样,也是线程共享的并且不需要连续的内存,其用于存储已被虚拟机加载的类信息,常量、静态变量、即时编译器编译后的代码等数据。

        (1)、运行时常量池,

          运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。类和接口的全限定名、字段的名称和描述符和方法的名称和描述符。

      

 

 

    

 

posted @ 2018-01-22 19:33  光辉蝈蝈  阅读(132)  评论(0编辑  收藏  举报