深入浅出JVM(一):运行时数据区域

程序计数器

  • 线程私有
  • 指向了正在执行的虚拟机字节码指令的地址;如果是本地方法,数值为空
  • 没有 OutOfMemoryError 错误的区域

Java虚拟机栈

  • 线程私有;
  • 生命周期与线程相同;
  • 代表着 Java 方法执行的内存模型:每个方法执行时的同时会创建一个栈帧(Stack Frame)用于存放局部比量表、操作数栈、动态链接、方法出口等信息。
    • 每个方法从调用到执行完毕的过程,对应着每一个栈帧在虚拟机栈中入栈到出栈的过程。
  • 如果线程请求的栈深度大于虚拟机允许的深度,跑出 StackOverflowError 异常;无法申请到足够的内存,抛出 OutOfMemoryError 错误。

本地方法栈

  • 线程私有;
  • 和 Java 虚拟机栈类似,但是是为 Native 方法服务。

Java 堆

  • 线程共享;
  • Java 虚拟机中内存最大的一块;
  • 惟一的作用是存放对象实例:所有的对象实例以及数组都要在堆上分配
  • 是垃圾收集器的主要区域。详细区分的话,可以分为新生代和老年代,再细致的话,可以分为 Eden 空间、 From Surivor 空间、 To Surivor 空间;
  • Java 堆可以处于物理上不连续的内存空间中,只要逻辑是连续的即可。 主流的虚拟机通过 -Xms-Xmx控制;
  • 如果堆中没有内存完成实例分配,并且堆无法再拓展时,抛出 OutOfMemoryError 错误。

方法区

  • 线程共享;
  • 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;
  • 已被称为 Non-Heap;
  • 有时候被称为永久带,原因:HotSpot 虚拟机将GC分带收集拓展至方法区;
  • 方法区内存无法满足内存分配需求时,抛出 OutOfMemoryError 错误。

    ####运行时常量池

    • 方法区的一部分;
    • 存放编译期产生的各种字面量和符号引用;
    • OOM 报错和方法区一致。

原文地址:https://www.cnblogs.com/psxjoy/p/11845401.html

时间: 2024-10-19 07:26:33

深入浅出JVM(一):运行时数据区域的相关文章

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(运行时数据区域)

以上是jvm在运行时内存的数据分区图例(各个分区简介): 1.程序计数器:           在jvm中一块很小的区域,主要作用就是记录当前线程执行字节码的行号指示器.           在单核的多线程中,cpu会在不同线程之间切换,为了切换回来时正确的回到当前线程的执行位置,           每个线程都有自己单独的程序计数器,之间互不影响,独立运行,同时这块区域也是在java虚拟机           规范中唯一没有规定任何OutOfMemoryError情况的区域. 2.虚拟机栈:

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)

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学习篇之-运行时数据区域

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

JVM 运行时数据区域

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

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

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

Java运行时数据区域

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