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 ...
随机推荐
- prototype原型(待完善)
模式:prototype 解决向量的深浅克隆 #pragma once #ifndef _PROTOTYPE_H_ #define _PROTOTYPE_H_ class Prototype{ pu ...
- sql索引的填充因子多少最好,填充因子有什么用
和索引重建最相关的是填充因子.当创建一个新索引,或重建一个存在的索引时,你可以指定一个填充因子,它是在索引创建时索引里的数据页被填充的数量.填充因子设置为100意味着每个索引页100%填满,50%意味 ...
- sqlDataAdapter和SqlCommand的区别
因为DataSet是离线的,所以SqlDataAdapter这个对象是连接DataSet和数据库的桥梁,所有对DataSet的操作(填充,更新等)都要通过他 ado.net数据访问有两种方式: 1.离 ...
- The last time the sprint(最后一个冲刺)
经过一两个月的努力,我们终于是做出来了一点东西,从一开始接触这个项目开始,从完全不知道怎么去入手到跌跌碰碰,再到现在可以拿出来一点东西给别人看,我觉得很开心,或许我的这个成品在别人眼中并不算是什么,但 ...
- 判断二叉树B是否是树A的子树
如下图所示,则认为树B是树A的子树. 代码如下: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode rig ...
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
条款4:了解如何观察推导出的类型 那些想要知道编译器推导出的类型的人通常分为两种,第一种是实用主义者,他们的动力通常来自于软件产生的问题(例如他们还在调试解决中),他们利用编译器进行寻找,并相信这个能 ...
- Vue2.0组件之间通信(转载)
Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单.笔者之前有写过一篇Vue2.0子父组件通信,这次我们就来聊一聊平级组件之间的通信. 首先我们先搭好开 ...
- 命令行方式操作O365
这几天公司为O365启用了双因子认证,期间出了些小问题,导致我无法使用管理员账号登入控制台,但是Powershell的方法依旧可以.所以我觉得还是有必要把图形化操作改成脚本操作,以备不时之需.以后凡是 ...
- POJ1637_Sightseeing tour
给一个联通图,有的是单向边,有的是双向边,问是否存在欧拉回路. 乍一看毫无思路,可以这样来搞,对于每条无向边,我们随便指定一个方向,看看是否能够做到所有点的度数之和为偶数. 接下来,对于我们指定的边, ...
- spring通过工厂模式解决页面耦合问题
spring通过工厂模式解决页面耦合问题