JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native Method Stack),堆区(Heap)以及方法区(Method Area)。其中前面3个是线程隔离的数据区,即各个线程均有一份,而后两者是共享区,即所有线程均共享同一份。接下来,我们分别来看一下这些线程隔离的数据区。

首先是程序计数器。

用于指示一个线程运行到哪个地方了,因为多个线程时,A线程有可能会被挂起从而转向运行B线程,那么等返回执行A线程时,JVM怎么记录A运行到哪里了呢?答案就是程序计数器,因此程序计数器是线程隔离的。那么计数器里存储的是什么东西呢?

首先我们要大概了解以下字节码文件长什么样子。

public voidF(){//原来的F方法内部的 java 代码,被翻译为下面的类似于汇编语言的指令

0xxxx ....2xxxx ....4xx ...5xxx ...

}

代码中的0、2、4、5是字节码的行号,程序计数器存储的正是字节码行号。所以程序计数器的运行原理就很明朗了。当然程序计数器是会被和线程一同创建的。程序计数器是唯一一个没有OutOfMemory异常的区域,因为它不会增加空间,不过随着程序的运行会改变。

接着是虚拟机栈。

我们常说的堆内存、栈内存的栈区一般指的就是这个,虚拟机栈被用于描述java的方法。每个java方法在执行时会创建一个栈帧(Stack Frame),栈帧的结构包括局部变量表,操作数栈,动态链接和方法出口几个部分。方法执行时创建栈帧,并进入虚拟机栈中,调用结束时,栈帧销毁。每个方法从调用到结束对应栈帧在虚拟机栈的声明周期。虚拟机栈是线程隔离的。

若栈帧一直增加,超过所允许的深度,将会导致StackOverflowError,可以想象如果方法无限递归没有出口就会导致该异常。

如果虚拟机栈可以动态扩展但在扩展中无法申请到足够的内存,就会抛出OutOfMemoryError异常。

栈帧-局部变量表:存放方法参数和方法内部的局部变量,因此,基本数据类型和引用类型的引用就存在栈区中栈帧的局部变量表。(引用类型的对象本身在堆区)

本地方法栈。

是针对Native的方法的栈,虚拟机栈是其他java方法的栈。不同虚拟机可以自由实现,比如常用的HotSpot虚拟机就选择合并虚拟机栈和本地方法栈。

java多线程内存隔离_JVM之Java运行时数据区(线程隔离区)相关推荐

  1. JVM(七) -- 内存与垃圾回收(二) -- 运行时数据区(四) -- Java堆

    运行时数据区最重要的内容,对应书中2.2.4节.3.8节. 位置: 1. 概述 一个java进程对应一个jvm虚拟机,也对应一个堆空间 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域 ...

  2. Java 虚拟机学习笔记 | 运行时数据区总结

    前言 要想学习好 Java,Java虚拟(JVM)的学习是绕不开的.学习 Java虚拟(JVM)首先就要先了解的就是Java虚拟(JVM)运行时数据区. 在Java语言和虚拟机规范中对运行时数据区进行 ...

  3. JVM内存区域(运行时数据区)划分

    前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...

  4. JVM运行时数据区和各个区域的作用

    一.JVM主要分为5个核心区域(6个子区域),分别是: 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 *运行时常量池(属于"方法区"的一部分) 二.各个区域作用和描 ...

  5. 从头开始学习->JVM(八):运行时数据区(下)

    前言 在上一篇文章中,我们了解到了JVM的运行时数据区,基本被划分了5个区域. 程序计数器(pc寄存器) java虚拟机栈 本地方法栈 java堆 方法区(永久代,元空间). 而上一篇文章中,我们详细 ...

  6. Java内存管理:Java内存区域 JVM运行时数据区

    Java内存管理:Java内存区域 JVM运行时数据区 在前面的一些文章了解到javac编译的大体过程.Class文件结构.以及JVM字节码指令. 下面我们详细了解Java内存区域:先说明JVM规范定 ...

  7. 1、虚拟机内存管理、运行时数据区、线程共享区、Java堆、新生代、老年代、Eden区域分配、方法区、线程独占区、虚拟机栈

    1.Java虚拟机内存管理 1.1.运行时数据区[Runtime Data Area] 1.1.1.线程共享区 1.1.1.1.Java堆[heap] 1.1.1.1.1.新生代.老年代.Eden区域 ...

  8. JVM(类加载、运行时数据区、堆内存、方法区、本地接口、执行引擎和垃圾回收)java虚拟机(JVM)的超详细知识点

    JVM虚拟机 一.JVM的概述 1.为什么要学习JVM 2.虚拟机 3.JVM的作用 作用 特点 4.JVM的位置 5.JVM的分类 6.各个组成部分的用途 7.Java 代码的执行流程 8.JVM ...

  9. Java虚拟机2:Java 运行时数据区

    前言快速到底 如果有人问你 java 的内存区域分为哪些,可能很多人会说:堆.栈.方法区--.我个人理解从开发者的角度 Java 能够涉及到"内存区域"的大致有两处:第一,java ...

最新文章

  1. 使用GDAL创建Erdas格式的金字塔
  2. 如何禁止使用本地administrator进行共享连接
  3. 膨胀和腐蚀之外的其他形态学变换
  4. php中对MYSQL操作之事务控制,回滚
  5. mysql典型sql示例(DML)
  6. layer中嵌套的页面如何操作父页面_layui框架中layer父子页面交互详细解说
  7. linux删除命令_【小技巧】Linux命令的快捷键
  8. Ant 基本语法的使用示列
  9. 那些让程序员提升30-80%的快捷键大全整理
  10. 大数据应用的优势在哪
  11. SpringBoot系列(9):SpringBoot配置文件详解
  12. 如何放大缩小地图 和 移动拖动 地图 (一张的那种,厂区地图非世界地图)
  13. 热门高薪岗位大数据开发 自学转行如何就业(自学教程 学习路线 方法建议)
  14. 【TAPD】快速上手
  15. 写给新的一年(2015)
  16. iMazing怎么恢复备份?iMazing恢复备份教程分享
  17. 解决File Cache Conflict
  18. 【2022 网鼎杯】青龙组 crypto WriteUp
  19. C++ 小游戏之推箱子
  20. 微信小程序 | 借ChatGPT之手重构社交聊天小程序

热门文章

  1. javaSE之类和对象(1)
  2. 让您感动感悟一生的话语!
  3. 嵌入式开发 延长FLASH使用寿命技巧
  4. DZ先生怪谈国标28181之国标注册
  5. 开发直播平台常用到的直播源码功能机制说明 1
  6. 记录几种隐藏链接代码,也就是暗链代码
  7. 用html写一个QQ空间登录页面
  8. android traceroute 功能实现,traceroute使用以及实现原理
  9. 使用Mac技巧:如何解决Mac大写锁定键失灵?
  10. Win8.1 无法安装驱动,驱动安装失败的解决方案