jvm内存模型(运行时数据区)
运行时数据区(runtime data area)
jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用。按线程共享与否可以分为线程间共享和线程间独立。
线程间独立的运行时数据区
线程间独立的区域随线程的创建而创建,随线程销毁而销毁。线程独立的区域内存储的数据只有该线程能够访问,对其他线程是不可见的。
程序计数器寄存器(pc Register)
每个线程都有自己的pc(程序计数器)register(寄存器)。在任意时点上,jvm中的线程只能执行一个类的一个方法,称为该线程的当前方法。程序计数器持有其所属线程的当前方法的JVM指令地址。
虚拟机栈(JVM Stack)
每个线程都有自己的虚拟机栈,其结构和通常所说的栈结构基本一样。虚拟机栈存储局部变量、计算结果、参与方法的调用和返回。虚拟机栈的存储单元是栈帧(frames)。虚拟机栈的基本操作就是栈帧的入栈和出栈,jvm规范中不要求其内存空间必须是连续的空间。
虚拟机栈涉及下面两个异常条件:
+ 如果线程需要的栈空间超过了允许的最大值(比如指定了栈的最大值),将抛出 StackOverflowError
+ 如果需要扩充虚拟机栈,或者初始化虚拟机栈时,没有更多内存可用,将抛出 OutOfMemoryError
本地方方栈(native method stack)
每个线程都有自己的本地方法栈,主要是给(native)本地方法使用。
本地方方栈的异常条件和虚拟机栈相同
线程间共享的内存区域
堆(heap)
堆是在虚拟机启动的时候创建的,我们通过new 操作符创建的所有对象都存在堆中,堆中的数据对所有线程都是可见的。堆也是我们常说的垃圾收集器的主要管理对象。
堆涉及的异常条件:
+ 当需要创建新的对象而堆内存不足时,将抛出OutOfMemoryError
方法区(method area)
方法区和堆一样都是在jvm启动时创建的,其数据对所有线程都是可见的。
方法去存储数据:
+ 每个类的源信息(meta data of class),比如类名、父类、实现的接口、访问修饰符等等
+ 运行时常量池(runtime constant pool)
+ 成员变量的信息
+ 方法的信息
+ 方法和构造方法的字节码
+ 类、实例、接口初始化专用方法
jvm规范对于方法区没有太多硬性的规定。逻辑上方法区是堆的一部分,但是jvm规范不强制要求方法区的实现位置(可以在堆内也可以在堆外),也不强制要求对方法区进行垃圾回收和内存整理/压缩(compact)以及字节码的管理策略。方法区使用的内存空间也可以不是连续的内存空间。
运行时常量池(runtime constant pool)
每个类或接口的运行时常量池在该类或接口由JVM创建时创建,其数据存储在方法区中。
运行时常量池是方法区中、甚至是整个运行时数据区中最重要的部分,因此通常都单独介绍
运行时常量池是每个类或者接口在编译后的字节码文件中的常量池表(constant_pool table)的运行时表述,作用类似于有些语言的符号表(symbol table)。
包含内容:
+ 编译时可以确定的方法中数值的字面值
+ 只有在运行时才能确定的成员变量的引用
+ 其它
运行时常量池的异常条件:
如果创建类(class)或接口时,没有足够的内存创建运行时常量池,将抛出OutOfMemoryError
jvm内存模型(运行时数据区)的更多相关文章
- 1、JVM 内存模型+运行时数据区+JVM参数
JMM(内存模型) 1.’主内存+每个线程有自己的内存 JVM运行时数据区 包含:1.程序计算器(每个线程自带):2.JAVA-STACK(每个线程自带):3.本地方法stack:4.堆:5.方法区 ...
- JVM内存结构——运行时数据区
在Java虚拟机规范中将Java运行时数据划分为6种,分别为: PC寄存器(程序计数器) Java栈 堆 方法区 运行时常量池 本地方法栈 一.PC寄存器(程序计数器) PC寄存器(Program C ...
- JVM 内存区域 (运行时数据区域)
JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...
- JVM学习笔记-运行时数据区
不同于C,C++程序,Java程序的内存管理工作由Java虚拟机(JVM)接管,这减低了java程序员的负担,但如果出现内存泄露与溢出问题如报OutOfMemory,StackOverFlow异常错误 ...
- JVM三部曲之运行时数据区 (第一部)
在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了 1.运行时数据区域: 在运行时数据区里存储类Class文件元数据(方法区),对象和数组(堆),方法参数局部变量( ...
- java内存区域----运行时数据区
Java虚拟机的内存区域也叫做java运行时数据区,共分为五个部分:程序计数器,方法区,本地方法栈,虚拟机栈和堆.方法区和堆是线程之间所共有的,程序计数器,本地方法栈,虚拟机栈是线程私有的.其中虚拟机 ...
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine ,既然是虚拟机, ...
- JVM之Java运行时数据区(线程隔离区)
来源 JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native ...
- JVM之Java运行时数据区(线程共享区)
JVM运行时区域各线程共享的区域包括堆区和方法区. 堆区 堆区最最主要的功能是存储对象实例[上篇也提到过],因此Java垃圾回收的主要战场就是在堆区,因此也有称为GC堆区.如果堆区的内存不够会出现Ou ...
随机推荐
- VANET
VANET知识 VANET与普通网络相比,与IOV的区别: VANET中Greedy Routing:基于距离(GPSR):基于速度和角度:基于道路层(TDR): Repair Strategy:Fa ...
- 1001.A+B Format (20) 解题
代码入口(https://github.com/NSDie/object-oriented) 这题的解题思路我有两个: 第一个是两个数字相加然后判断位数,因为题目限制了范围1000000的绝对值以内嘛 ...
- 第三个spirit(第十四天)
一 .进度(自习室) 本来十号要开始进行第三次冲刺,不过因为团队很多成员要进行协会和组织的换届,而且团队还换了新 人又加了人进来,所以我们今天才是第三次冲刺的第一天.我们进行了新团队的第一次会议.基于 ...
- 项目报错“JavaServer Faces 2.2 can not be installed : One or more constraints”等一系列问题
在做springmvc+maven项目时,经常遇到如下错误: 解决办法(这里以jdk1.8,web3.0为例): 一:保证build path的jre版本 remove掉旧版本的,add新版本 二:保 ...
- C# 通过http post 请求上传图片和参数
一.C# Winform或控制台 /// <summary> /// 通过http上传图片及传参数 /// </summary> /// <param name=&quo ...
- 6th Alpha阶段的postmortem报告
组名:好好学习(代组长发布) 会议重要内容记录: 1. 尝试在beta阶段实现的功能,与alpha阶段相比的优势 (1)更改软件现有的bug: 1)软件的账目只能输入,但是一旦发生失误却无法更改和 ...
- 关于js typeof 的理解
- rhel和centos7下更改网卡名称ens33为eth0
Linux使用小Tips 整理些Linux些常遇到的问题. 修改网卡ens33为eth0 在使用RHEL和Centos7,发现网卡名称变成了EnoX,挺不习惯.现更改回旧名称eth0看着顺眼. 备份/ ...
- 【Python】Python简介
Python是一种既使用简单又功能强大的高级编程语言,同时支持面向过程的编程和面向对象的编程. 官方对python的介绍:Python 是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简 ...
- python对excel操作
学习一下:原文链接:http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html 一.安装xlrd模块 到python官网下载http:/ ...