jvm内存模型(运行时数据区)
来源:互联网 发布:双十一淘宝描述不符 编辑:程序博客网 时间:2024/06/05 12:42
原文:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.5
运行时数据区(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内存模型(运行时数据区)
- Java内存模型小析值JVM运行时数据区域(一)
- jvm 运行时内存数据区
- JVM运行内存模型
- JVM运行时的内存模型
- JVM运行时内存数据区结构及内存参数
- JVM虚拟机模型和运行时数据区
- 【jvm学习】jvm运行时内存分配模型分析
- 【jvm】JAVA运行时数据区与内存分配
- Java内存区域 JVM运行时数据区
- JVM内存管理-运行时数据
- java--jvm--jvm运行时数据区
- JVM运行时数据区
- JVM 运行时数据区
- JVM运行时数据区
- JVM运行时数据区
- JVM-运行时数据区
- JVM运行时数据区
- Cypher查询语言--Neo4j中的SQL(5)
- Struts2拦截器
- oracle创建用户ORA-01045:user lacks CREATE SESSION privilege;logon denied..的问题
- 解决IOS在网页摇一摇会出现撤销弹出框的一种方案带音效的哈
- Swift中如何通过KVC将自定义的UITabbar设置为UITabbarController的tabbar
- jvm内存模型(运行时数据区)
- Cypher查询语言--Neo4j中的SQL(6)
- PHP生成验证码
- maven jar包不能下载,解决办法(.jar.lastUpdated)
- Jlink 刷新固件相关问题
- 使用hashmap存储对象 并获取元素 祛除重复元素需要在类对象中重写hashcode和equal方法哦
- Angular提供的标准服务组件
- 实现技能CD
- mysql 查询补空行,提供给报表输出