JVM运行时数据区(一)

1、名词解释:

  栈帧:栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。

2、程序计数器:

  程序计数器是一块比较小的内存空间,可以将它看作是当前线程所执行的字节码的行号指示器。

  由于Java是支持多线程的语言,当运行的线程数超过CPU数量时,线程之间根据CPU时间片轮询抢夺CPU资源,在任意一个时刻,一个处理器(例如一个单核的CPU)都只能执行一条线程中的指令,

其他线程都必须被切换出去。因此为了保证每一个线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各个线程之间,程序计数器独立工作,互不影响;所以程序计数器是线程

的私有空间。

  如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果当前线程正在执行一个Native方法,则程序计数器为空。在Java虚拟机规范中,该区域是没有规定任何OOM

的区域。

3、Java虚拟机栈

  Java虚拟机栈与程序计数器一样也是线程私有的内存空间,它随着线程的创建而创建,随着线程的消失而消失;它主要用于存储方法的局部变量、操作数栈、动态链接方法和返回地址等信息。

  虚拟机在运行时使用一种叫栈帧的数据结构保存上下文数据。在栈帧中,存放了方法的局部变量表、操作数栈、动态链接方法和返回地址等信息。每一个方法的调用都伴随着栈帧的入栈操作;相同地,

方法的返回则伴随着栈帧的出栈操作(这就是传说中的入栈、出栈)。由于局部变量表中存储的是基本数据类型(boolean、byte、int、short、char、float、double、long)、对象的引用(可以理解为一个指针,

指向堆内存中的对象)和返回值地址,所以当一个方法的参数和局部变量相对较多时,那么栈帧中的局部变量表就会比较大,栈帧会膨胀以满足方法调用所需传递的信息。

  在Java虚拟机栈中与性能调优关系最为密切的部分就是局部变量表。局部变量表用于存放方法的参数和局部变量。其中long与double占用8个字节(64位),int和float占用4个字节,short和char占用2个字

节,byte占用1个字节,boolean占用1位(虚拟机按1个字节进行处理)。在方法执行时,虚拟机使用局部变量表完成方法的传递,对于非static方法还会将当前对象this作为参数通过局部变量表传递给当前方法。

  Java虚拟机规范允许,Java栈的大小是动态的或者固定的。在java虚拟机规范中,对该区域定义了两种异常:StackOverflowError和OOM(OutOfMemoryError在以后的文章中都将使用OOM来表示

OutOfMemoryError)。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则抛出StackOverflowError;如果Java栈可以动态扩展,而在扩展栈的过程中,没有足够的内存空间来支持栈的扩展,则

抛出OOM。

  在Java虚拟机中,可以使用-Xss参数来设置栈的大小。栈的大小直接决定了函数调用的可达深度。

原文地址:https://www.cnblogs.com/tester-hqser/p/9321001.html

时间: 2024-10-09 22:22:37

JVM运行时数据区(一)的相关文章

JVM运行时数据区与JVM堆内存模型小结

前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 程序计数器:保存当前线程执行的指令的地址(大意如此). 虚拟机栈:由栈帧组成,而每个栈帧又包括局部变量表.操作数栈.动态连接(调用其他方法).出口(被调用时返回值) -- 每个栈帧就代表了一个方法的执行. 本地方法栈:类似虚拟机栈,只不过方法改成了native方法. 方法区:保存了类的各种信息.类的

JVM运行时数据区

本篇主要介绍一下,JVM运行时数据区的内容. 首先大概介绍一下下图所示的内容.JVM运行时数据区主要分为了两大部分的内容:线程共有的方法区(Method Area)和堆(Heap).线程私有的虚拟机栈(VM Stack),本地方法栈(Native Method Stack)和程序计数器(Program Counter Register).在数据区下面的执行引擎中又包含了:即时编译器(JITCompiler)和垃圾收集器(GC).GC主要用于回收线程共享的区域(方法区和堆),对于私有的内存区域则方

jvm特性与原理---------->jvm运行时数据区分区

1.概述: 内存分区:JVM会把自己所管理的所有内存区域进行分区. 各个区域的服务对象 各个区域中分别存放了什么内容 存放的数据是如何创建的 这些数据在各个区域中存放,存储的布局是什么样的 如何访问存放在不同内存区域的数据 各个区域的创建和销毁时间 随着进程的启动和结束而创建和销毁 随着线程的启动和结束而创建和销毁 各个区域服务过程中可能产生的问题(异常) 各个区域中可能产生的异常 如何解决上述各种异常 2.JVM内存分区 3.JVM内存各个区域的比较   JVM内存分区(JVM运行时数据区)

Java虚拟机原理图解----JVM运行时数据区

     JVM运行时数据区(JVM Runtime Area) 其实就是指JVM在运行期间,其对计算机内存空间的划分和分配.本文将通过以下几个话题来讨论JVM运行时数据区. Topic 1. JVM运行时数据区 里有什么? Topic 2. 虚拟机栈 是什么?虚拟机栈 里有什么? Topic 3. 栈帧是什么?栈帧 里有什么? Topic 4. 方法区 是什么?方法区 里有什么? Topic 1.JVM运行时数据区里有什么? Topic 2. 虚拟机栈是什么?虚拟机栈里有什么? Topic 3

IT忍者神龟之 《Java虚拟机原理图解》JVM运行时数据区

[last updated :2014/11/7]      JVM运行时数据区(JVM Runtime Area)其实就是指JVM在运行期间,其对计算机内存空间的划分和分配.本文将通过以下几个话题来讨论JVM运行时数据区. Topic 1. JVM运行时数据区里有什么? Topic 2. 虚拟机栈 是什么?虚拟机栈里有什么? Topic 3.栈帧是什么?栈帧里有什么? Topic 4. 方法区是什么?方法区里有什么? Topic 1.JVM运行时数据区里有什么? Topic 2. 虚拟机栈是什

Java内存模型与JVM运行时数据区的区别

首先,这两者是完全不同的概念,绝对不能混为一谈. 1.什么是Java内存模型? Java内存模型是Java语言在多线程并发情况下对于共享变量读写(实际是共享变量对应的内存操作)的规范,主要是为了解决多线程可见性.原子性的问题,解决共享变量的多线程操作冲突问题. 多线程编程的普遍问题是: 所见非所得 无法肉眼检测程序的准确性 不同的运行平台表现不同 错误很难复现 故JVM规范规定了Java虚拟机对多线程内存操作的一些规则,主要集中体现在volatile和synchronized这两个关键字. vo

JVM 运行时数据区详解

一.运行时数据区: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域. 1.有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,所有的线程共享这些数据区. 2.第二种则是与线程一一对应,随线程的开始和结束而创建和销毁,线程之间相互隔离. java虚拟机所管理的内存将会包括以下几个运行时数据区域 二.数据区详解 1.程序计数器(Program Counter Register) 也叫PC寄存器是一块较小的内存空间,它的作用是存储当前线程所执行的字节码的信号指示器.

(转)JVM运行时数据区

转:http://www.cnblogs.com/myna/p/7567208.html java虚拟机运行时数据区,具体分为如下几个区域 程序计数器(Program Counter Register) 程序计数器是一块很小的内存区域,存储了下一条需要执行的字节码指令的地址,此处的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量.每个线程都有独立的程序计数器(PCR),在线程启动时会创建,多线程切换时可以恢复每一个线程的当前执行位置,所以线程之间不会相互影响.当执行Jav

JVM运行时数据区划分

Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行.不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区) (图源阿里)JDK8的元数据区+JIT编译产物 就是JDK8以前的方法区 JavaAPI中的Runtime public class Runtime extends Object Every Java

JVM运行时数据区--java虚拟机栈

虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令. 内存中的堆与栈 栈是运行时的单位,而堆是存储的单位1.栈解决程序的运行问题,即程序如何执行,或者说如何处理数据.堆解决的是数据存储的问题,即数据怎么放.放在哪儿. 2.一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块 3.栈空间存放 基本数据类型的局部变量,以及引用数据类型