JVM之Java运行时数据区(线程隔离区)
JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native Method Stack),堆区(Heap)以及方法区(Method Area)。其中前面3个是线程隔离的数据区,即各个线程均有一份,而后两者是共享区,即所有线程均共享同一份。接下来,我们分别来看一下这些线程隔离的数据区。
首先是程序计数器。
用于指示一个线程运行到哪个地方了,因为多个线程时,A线程有可能会被挂起从而转向运行B线程,那么等返回执行A线程时,JVM怎么记录A运行到哪里了呢?答案就是程序计数器,因此程序计数器是线程隔离的。那么计数器里存储的是什么东西呢?
首先我们要大概了解以下字节码文件长什么样子。
public void F(){
// 原来的F方法内部的 java 代码,被翻译为下面的类似于汇编语言的指令
0 xxxx ....
2 xxxx ....
4 xx ...
5 xxx ...
}
代码中的0、2、4、5是字节码的行号,程序计数器存储的正是字节码行号。所以程序计数器的运行原理就很明朗了。当然程序计数器是会被和线程一同创建的。程序计数器是唯一一个没有OutOfMemory异常的区域,因为它不会增加空间,不过随着程序的运行会改变。
接着是虚拟机栈。
我们常说的堆内存、栈内存的栈区一般指的就是这个,虚拟机栈被用于描述java的方法。每个java方法在执行时会创建一个栈帧(Stack Frame),栈帧的结构包括局部变量表,操作数栈,动态链接和方法出口几个部分。方法执行时创建栈帧,并进入虚拟机栈中,调用结束时,栈帧销毁。每个方法从调用到结束对应栈帧在虚拟机栈的声明周期。虚拟机栈是线程隔离的。
若栈帧一直增加,超过所允许的深度,将会导致StackOverflowError,可以想象如果方法无限递归没有出口就会导致该异常。
如果虚拟机栈可以动态扩展但在扩展中无法申请到足够的内存,就会抛出OutOfMemoryError异常。
栈帧-局部变量表:存放方法参数和方法内部的局部变量,因此,基本数据类型和引用类型的引用就存在栈区中栈帧的局部变量表。(引用类型的对象本身在堆区)
本地方法栈。
是针对Native的方法的栈,虚拟机栈是其他java方法的栈。不同虚拟机可以自由实现,比如常用的HotSpot虚拟机就选择合并虚拟机栈和本地方法栈。
JVM之Java运行时数据区(线程隔离区)的更多相关文章
- JVM之Java运行时数据区(线程共享区)
JVM运行时区域各线程共享的区域包括堆区和方法区. 堆区 堆区最最主要的功能是存储对象实例[上篇也提到过],因此Java垃圾回收的主要战场就是在堆区,因此也有称为GC堆区.如果堆区的内存不够会出现Ou ...
- Jvm基础(1)-Java运行时数据区
最近在看<深入理解Java虚拟机>,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此.这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出. 首先把图贴上来 ...
- 【转】Java运行时数据区简介及堆与栈的区别
理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...
- Java 运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- 读书笔记-浅析Java运行时数据区
作为一个 Java 为主语言的程序员,我偶尔也需要 用 C/C++ 写程序,在使用时让我很烦恼的一件事情就是需要对 new 出来的对象进行 delete/free 操作,我老是担心忘了这件事情,从而导 ...
- jvm内存模型(运行时数据区)
运行时数据区(runtime data area) jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...
- JVM内存结构——运行时数据区
在Java虚拟机规范中将Java运行时数据划分为6种,分别为: PC寄存器(程序计数器) Java栈 堆 方法区 运行时常量池 本地方法栈 一.PC寄存器(程序计数器) PC寄存器(Program C ...
- JVM学习笔记-运行时数据区
不同于C,C++程序,Java程序的内存管理工作由Java虚拟机(JVM)接管,这减低了java程序员的负担,但如果出现内存泄露与溢出问题如报OutOfMemory,StackOverFlow异常错误 ...
- JVM三部曲之运行时数据区 (第一部)
在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了 1.运行时数据区域: 在运行时数据区里存储类Class文件元数据(方法区),对象和数组(堆),方法参数局部变量( ...
随机推荐
- Spring Maven工程引入css,js
1.CSS <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet" type="t ...
- 安卓中listview中性能优化的处理
1.在adapter中的getView方法中尽量少使用逻辑 不要在你的getView()中写过多的逻辑代码,我们能够将这些代码放在别的地方.比如: 优化前的getView(): @Override p ...
- Source Insight快捷键
常用使用技巧 按住"ctrl", 再用鼠标指向某个变量(或函数),点击一下,就能进入这个变量(或函数)的定义. 快捷键 "Alt + F12",可以让显示界面中 ...
- knox 编译 源码
1. git clone https://gitbox.apache.org/repos/asf/knox.git cd knox mvn clean install https://cwiki.ap ...
- 学习Elasticsearch原理笔记
Elasticsearch是一个分布式可拓展的实时搜索和分析引擎 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索 实时分析的分布式搜索引擎 可以拓展到上百台服务器,处理PB级别的结构化或 ...
- Flask 中command的使用
其实这个标题有点大了,只是记录以一下flask中command的一个使用方式,具体用法还需要看相关文档. 之前的项目中需要加一个定时任务所以在flask中写了个任务执行. 首先需要在manage.py ...
- Sonya and Bitwise OR CodeForces - 1004F (线段树,分治)
大意: 给定序列$a$, 给定整数$x$. 两种操作(1)单点修改 (2)给定区间$[l,r]$,求有多少子区间满足位或和不少于$x$. 假设不带修改. 固定右端点, 合法区间关于左端点单调的. 可以 ...
- MySQL 子查询(三) 派生表、子查询错误
From MySQL 5.7 ref:13.2.10.8 Derived Tables 八.派生表 派生表是一个表达式,用于在一个查询的FROM子句的范围内生成表. 例如,在一个SELECT查询的FR ...
- javascript 垃圾回收机制和内存管理
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 垃圾回收机制的原理是找到不再被使用的变量,然后释放其占用的内存,但这个过程不是时时的,因为其开销比较大,所 ...
- (十五)SpringBoot之使用Redis做缓存数据
一.添加Redis依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
