程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空). Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口等信息.每一个方法从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程. 可以通过 -Xss 这个虚拟机参数来指定一个程序的 Java 虚拟机栈内存大小: java -Xss=512M HackTheJava 该区域可能抛出以下异常: 当线程请求的栈深度超过最大值,会抛…
Java虚拟机运行时数据区域 程序计数器(Program Counter) 程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪. Java的多线程实际上是通过线程轮转做到的,如果是一个单核的机器(或单cpu),严格意义上在一个时间块中只会有一个线程在执行.为了线程切换以后能恢复到正确的执行位置,每个线程都需要有一个单独的计数器,每个计数器之间要是独立的互不干扰. 如果线程执行的是Java方法,那么PC指向的是正在执行的虚拟机字节码指令的区域,如果执行的是native方法,那…
一.Java内存区域 1.运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器.字节码解释器在执行时通过改变计数器的值来选取下一条要执行的字节码的指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成 程序计数器是线程私有的内存区域 此内存区域是唯一一个Java虚拟机规范中没有规定任何OOM(O…
Java虚拟机管理的内存包括如图所示的运行时数据区域: 下面分别进行介绍: 1)程序计数器(Program Counter Register) 占用的内存空间比较小,主要作用就是标识当前线程执行的字节码的行号.字节码解释器的工作就是通过不断改变计数器的值来获取下一条要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等功能都需要依赖程序计数器. 程序计数器在每个线程中都是独立互不影响的,因为Java虚拟机多线程的实现是通过轮流切换并分配时间给每个线程来完成的.每个处理器在一个确定的时刻只会执…
    Java虚拟机数据运行时区域 方法区(Method Area) 存储加载的类信息,常量,静态变量,编译器编译后的代码等数据.虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做Non-Heap.Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池,用于存放编译器生成的各种字面量和符号引用,包括字符串常量.JVM加载Class后把常量池中的数据放入到运行时常量池.方法区的运行时数据(包括运行时常量池)是线程共享的. 堆(Java Heap) 堆是被线…
目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内存模型 JVM实现的堆内存和方法区 新生代和老年代. 新生代中的内存划分 由JDK1.7及以前的永久代到JDK1.8的元数据区 参考资料 介绍 初学Java虚拟机几天, 被方法区, 永久代这些混杂的概念搞混了. 我觉得学习这部分知识应该把官方定义的虚拟机运行时数据区域和虚拟机内存结构分开叙述, 要不…
Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机在Java程序运行时会将内存区域划分成若干个不同的区域,各自负责不同的职责,这些区域都有各自的用途. Java虚拟机运行时数据区分为以下几个部分. 方法区.虚拟机栈.本地方法栈.堆.程序计数器,如下图所示: 图片来源于网络如有侵权请私信删除 2.2.1 程序计数器 程序计数器是一块较小的内存空间,可以看作当前…
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机的进程启动而存在,有的区域则依赖于用户线程的启动和结束而建立和销毁. HotSpot 运行时数据区 运行时数据区在 HotSpot 1.8 之前的版本和 1.8 版本有所不同,主要是 方法区移到元空间 了. 图 1-1:JDK1.8 之前 JVM 运行时数据区…
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机的进程启动而存在,有的区域则依赖于用户线程的启动和结束而建立和销毁. HotSpot 运行时数据区 运行时数据区在 HotSpot 1.8 之前的版本和 1.8 版本有所不同,主要是 方法区移到元空间 了. 图 1-1:JDK1.8 之前 JVM 运行时数据区…
运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆(GC堆)方法区运行时常量池 运行时数据区 Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域.这些数据区域有各自的用途.以及创建和销毁时间.有的随着虚拟机启动而启动,有的区域则依赖java线程的启动和结束来建立和销毁. Java虚拟机运行时数据区图如下(来自深入理解Java虚拟机:jvm的高级特性和实践): 以下对运行时数据区的各个区域做相应的解释: 程序计数器 程序计数器是一个较小的内存空间,可以把它看做当前线…