jvm的几个运行时数据区域--转

上一篇文章已经简单介绍了jvm的内部体系结构。并且对各个组成部分做了简要的说明。下面通过一个简单的java程序,讲解运行过程中牵涉到的几个数据区域。

代码如下:

 1 public class Test {
 2
 3     public static void main(String[] args) {
 4        int tempA = 1;//1
 5        int tempB = 2;//2
 6        Test test = new Test();//3
 7        int rs = test.add(tempA, tempB);//4
 8        System.out.println(rs);//5
 9     }
10
11     public int add(int a,int b) {
12         return a+b;//6
13     }
14
15 }

jvm实例运行一个Java程序,首先需要通过类装载器子系统把作为程序运行起点的类装载到内存。形成可以被虚拟机直接使用的Java类型。在上面的例子中,当Test类加载完成时,jvm实例几个重要的运行时数据区域如下图1所示:

图1 几个重要的运行时数据区域

注意在图1中,忽略了jvm运行时其它一些细节部分的内容。图中只显示代码例子密切相关的。在类装载器加载class文件到内存的过程中,虚拟机会提取其中的类型信息,并将这些信息存储到方法区。并且在堆中生成一个与类数据存在某种关联的Class对象。这种Class对象,在java程序中可以通过几种方式获取。以String类型为例:

1 String str ="test";
2 Class class1 = String.class;
3 Class class2 = str.getClass();
4 Class class3 = Class.forName("java.lang.String");

一旦获取了类所对应的Class对象之后,就可以通过反射机制获得存储在方法区中类数据相关的信息。另外在静态方法需要同步的时候,用的就是静态方法所在类对应的Class对象。

1 public static synchronized void syncMethod(){} 

虚拟机把主类装载进内存后,启动一个新线程,并且为这个新线程分配一个Java栈和PC(程序计数器)寄存器。紧接着调用Test类的main方法,执行代码//1、//2、//3。在执行完//3代码而又准备执行//4代码时,jvm实例几个重要的运行时数据区域如下图2所示:

图2 几个重要的运行时数据区域

在上图中pc寄存器test线程部分内容,作用可以看做是java栈中test线程所执行的字节码的行号指示器。随着执行引擎执行java程序代码//1、//2、//3的字节码,行号指示器的值也跟着改变。Java栈以帧为单位保存线程的运行状态的。一个栈帧包含一个java方法的调用状态,它存储有局部变量表、操作栈、动态链接、方法出口等信息。图中只显示了栈帧中局部变量表部分内容。对于基本数据类型(int、byte、long等等)是以值的形式存储在栈帧的局部变量表中的,如例子中的变量tempA和tempB。而对象的话是以引用的形式存储。它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置。总之,根据存储在局部变量表部分的对象引用,通过某种方式能找到在堆中与之关联的对象实例数据。如例子中的test引用。

虚拟机在执行完java代码//3后,紧接着执行代码//4。在执行add方法的字节码之前,先压入一个新的栈帧到该线程的java栈中。当方法返回时,这个栈帧被从java栈中弹出并抛弃。当虚拟机执行到java代码//6时,jvm实例几个重要的运行时数据区域如下图3所示:

图3 几个重要的运行时数据区域

当add方法执行完成,成功返回。然后虚拟机准备执行java代码//5时,jvm实例几个重要的运行时数据区域如下图4所示:

图4 几个重要的运行时数据区域

当虚拟机把最后一行java代码//5也执行完了,这个虚拟机实例也就随之消亡。

http://www.cnblogs.com/evan2012/archive/2012/05/10/2495229.html

时间: 2024-08-24 07:45:01

jvm的几个运行时数据区域--转的相关文章

JVM学习篇之-运行时数据区域

1.什么是jvm? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 2.jvm 运行时数据区域 堆和方法区是所有线程共有的. 虚拟机栈,本地方法栈和程序计数器则是线程私有的. 2.1 程序计数器: 一块较小的内存空间(线程私有的内存),当前线程所执行的字节码的行号指示器.字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令:分支.循环.跳转等.

JVM<一>----------运行时数据区域

参考:1.JVM Specification: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5 2.<深入理解Java虚拟机> 刚开始看JVM Specification ,说实话由于专业英语不过关,有些关键词总是看不懂意思,后来参考.<深入理解Java虚拟机>方能感悟到JVM的强大. 我们就先从运行时数据区域开始 一.运行时数据区域分配图 The Java Virtual Machine

JVM学习笔记:Java运行时数据区域

JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私有的,即每个线程各自都有自己的一份.绿色部分是各个线程共享的. 1.PC寄存器(The pc Register) (1)每一个Java线程都有一个PC寄存器. (2)PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息. (3)此内存区域是唯一一个在JV

JVM【第二回】:【JVM运行时数据区域详解】

上一回对JVM运行时数据区域的组织结构进行了概述,这一回将对各个组成进行详解. 程序计数器[Program Counter Register] 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器完成. 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的

JVM运行时数据区域分析

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁. 原文链接:http://sparkyuan.me/2016/04/22/JVM运行时数据区域/ ,转载请注明出去 程序计数器(PC) 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码行号指示器. - 当前线

JVM 运行时数据区域

Java虚拟机管理的内存包括以下几个运行时数据区域: 1.程序计数器: 程序计数器是一块比较小的内存空间,是当前线程执行的字节码行号指示器.Java多线程是通过线程轮流切换来实现的,所以每个线程都有一个自己独立的程序计数器,各个线程的程序计数器互补干扰. 2.Java虚拟机栈 Java虚拟机栈描述的是Java方法的执行模型:每个方法执行的时候都会创建一个帧栈用于存放局部变量表,操作栈,动态链接,方法出口等信息.一个方法的执行过程,就是这个方法对于帧栈的入栈出栈过程. 3.本地方法栈 本地方法栈与

JVM【第一回】:【JVM运行时数据区域总览】

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机的进程的启动而存在,有些区域则是依赖用户的线程的启动和结束而建立和销毁.Java虚拟机所管理的内存将会包括一下几个运行时数据区域,如下图所示: 欲知后事如何,且听下回分解

Java运行时数据区域

运行时数据区域 Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在, 有些区域则是依赖用户线程的启动和结束而建立和销毁.如图 1.1 程序计数器 是一块内存比较小的空间.作用:用来标志当前线程所执行的字节码的行号指示器(即在字节码中添加编号).在jvm中,字节码解释器工作时就是通过改变这个计数器上的值来选取下一条需要执行的字节码指令.在分支.循环.跳转.异常处理.线程恢复等功能都需要

Java虚拟机 - 结构原理与运行时数据区域

http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文件格式 Ja