运行时数据区(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. 1、JVM 内存模型+运行时数据区+JVM参数

    JMM(内存模型)  1.’主内存+每个线程有自己的内存 JVM运行时数据区 包含:1.程序计算器(每个线程自带):2.JAVA-STACK(每个线程自带):3.本地方法stack:4.堆:5.方法区 ...

  2. JVM内存结构——运行时数据区

    在Java虚拟机规范中将Java运行时数据划分为6种,分别为: PC寄存器(程序计数器) Java栈 堆 方法区 运行时常量池 本地方法栈 一.PC寄存器(程序计数器) PC寄存器(Program C ...

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

    JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...

  4. JVM学习笔记-运行时数据区

    不同于C,C++程序,Java程序的内存管理工作由Java虚拟机(JVM)接管,这减低了java程序员的负担,但如果出现内存泄露与溢出问题如报OutOfMemory,StackOverFlow异常错误 ...

  5. JVM三部曲之运行时数据区 (第一部)

    在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了 1.运行时数据区域: 在运行时数据区里存储类Class文件元数据(方法区),对象和数组(堆),方法参数局部变量( ...

  6. java内存区域----运行时数据区

    Java虚拟机的内存区域也叫做java运行时数据区,共分为五个部分:程序计数器,方法区,本地方法栈,虚拟机栈和堆.方法区和堆是线程之间所共有的,程序计数器,本地方法栈,虚拟机栈是线程私有的.其中虚拟机 ...

  7. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  8. JVM之Java运行时数据区(线程隔离区)

    来源 JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native ...

  9. JVM之Java运行时数据区(线程共享区)

    JVM运行时区域各线程共享的区域包括堆区和方法区. 堆区 堆区最最主要的功能是存储对象实例[上篇也提到过],因此Java垃圾回收的主要战场就是在堆区,因此也有称为GC堆区.如果堆区的内存不够会出现Ou ...

随机推荐

  1. 《Spring1之第十次站立会议》

    <第十次站立会议> 昨天:试着把用C#写的代码转换为java语言. 今天:已基本转换为java语言了,也能够实现视频聊天这个功能了. 遇到的问题:在进行视频通话时没有考虑到声音优化功能,实 ...

  2. 啊啊啊 草蛋啊 之前努力一天搞出来的时间算法 被一句pk掉 给我砖头

    package yun3; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Cale ...

  3. iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件上传

    官方建议AFN的使用方法 0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目   •2. 或使用Cocopod 导入AFNetworking3.0+   •3.  引入 ...

  4. PROFIBUS-DP现场总线的结构及应用

    PROFIBUS的最大优点在于具有稳定的国际标准EN50170作保证,并经实际应用验证具有普遍性.目前已广泛应用于制造业自动化.流程工业自动化和楼宇.交通电力等领域. PROFIBUS由3个兼容部分组 ...

  5. 补发9.27“天天向上”团队Scrum站立会议

    组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.27 地点:612寝 组员 已完成 未完成 王森 分析设计亮点 原型搭建 张金生 设计UI框架 美化完善 张政 学习C#语言初步应用 熟练 ...

  6. [转帖]一文读懂 HTTP/2

    一文读懂 HTTP/2 http://support.upyun.com/hc/kb/article/1048799/ 又小拍 • 发表于:2017年05月18日 15:34:45 • 更新于:201 ...

  7. 聚合函数count里面加条件

    聚合函数中如果想汇总某一类数据,可以在括号中增加条件: sum(case when 字段>0 then 1 else 0 end) as 字段 *注意:count(case when 字段> ...

  8. macOS how to install python3

    macOS how to install python3 macOS & Python 3.7.2 https://www.python.org/downloads/mac-osx/ http ...

  9. Centos7 pip 安装MySQLdb(mysql-python)出错

    租了个阿里云的Centos7的ECS,需要使用pip安装MySQLdb模块.也就是mysql-python模块. 但是遇到问题 Collecting mysql-python Downloading ...

  10. javascript定时保存表单数据的代码

    (忘记是不是两家邮箱都有这个功能). 那这个功能是怎么做的呢? 定时,我们知道怎么弄,但保存呢?也许我们会通过隐藏域等手段来存放数据.但是,这个却有个缺点:那就是刷新页面后,数据将会丢失. 而此时,就 ...