java虚拟机学习笔记 ---- 虚拟机运行数据区域

Java虚拟机在运行java程序的时候,会将内存分为不同的几个区域,分别是程序计数器、虚拟机栈、本地方法栈、堆、方法区。

一、程序计数器

  程序计数器是内存中非常小的一块区域,并且是线程私有的,代表当前线程执行字节码的行号指示器,字节码解释器通过程序计数器来改变计数器的值来执行字节码指令,分支、循环、跳转、异常处理、线程回复都是依赖计数器来完成的。如果虚拟机执行的是Native方法,则程序计数器值为null,否则会是需要执行字节码的地址。

二、java虚拟机机栈

  java虚拟机栈是线程私有的,生命周期与线程生命周期相同,虚拟机栈是描述java方法执行的内存模型,每个方法被执行的时候都会创建一个栈帧用来存储局部变量表,操作栈,动态链接、方法出口等信息,每一个方法被调用知道执行完成的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。其中,局部变量表存放编译期可知的基本类型、对象引用、returnAddress,局部变量所需内存在编译期完成分配,方法运行期间不会改变局部变量表的大小。

三、本地方法栈

  与java虚拟机栈发挥作用相似,本地方法栈是为虚拟机使用到的Native方法服务。

四、堆

  堆是垃圾回收的主要区域,堆中主要存放对象的实例数据,是java虚拟机所管理的内存中最大的一块,所有线程共享的一块区域,在虚拟机启动时创建,其中堆可以细分为新生代和老生代,堆可以通过-Xmx和-Xms扩展。堆是线程共享的。

五、方法区

  方法区与java堆一样,是各个线程共享的内存区域,用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码(None-Heap)。

  六、运行时常量池

  运行时常量池属于方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等信息之外,还有常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法去区的运行时常量池中,具有动态性,运行期间也可能将新的常量放入常量池

posted @ 2019-05-04 16:38  Battle_Symphony  阅读(127)  评论(0编辑  收藏  举报