1.Java 技术体系结构
Java 技术体系: 广义上, Clojure,JRuby,Groovy 等运行于 java 虚拟机上的语言以及相关的程序都属于 java 技术体系的一员. sun 官方所定义的 java 技术体系包括以下几个组成部分:
java 程序设计语言, 各种平台上的 java 虚拟机, class 文件格式, java api 类库, 来自商业机构和开源机构的第三方类库
2. java 运行时数据区
2.1 程序计数器(Program Counter Register)
程序计数器(Program Counter Register) 是一块较小的内存空间, 它可以看作是当前线程所执行的字节码的行号指示器. 在虚拟机的概念模型里, 字节码解释器工作时就是通过改变这个计数器的值来选取下一条执行字节码指令.
每条线程都有一个独立的程序计数器.
如果执行的是 java 方法, 这个计数器记录的是正在执行的虚拟机字节码指令地址. 如果是 native 方法, 计数器为空. 此内存区域是唯一一个在 java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域.
2.2 java 虚拟机栈
同样是线程私有, 描述 Java 方法执行的内存模型: 每个方法在执行的同时都会创建一个栈帧 (Stack Frame) 用于存储局部变量表, 操作数栈, 动态链接, 方法出口等信息. 一个方法对应一个栈帧.
常有人把 java 内存分为堆内存 (heap) 和栈内存 (stack) 其实是粗糙的, 所指的栈就是虚拟机栈, 或者是说虚拟机中的局部变量部分
局部变量表存放了各种基本类型, 对象引用和 returnAddress 类型(指向了一条字节码指令地址). 其中 64 位长度 long 和 double 占两个局部变量空间, 其他只占一个.
java 虚拟机规范中, 规定这个区域的异常情况有两种: 1. 线程请求的栈的深度大于虚拟机所允许的深度, 将抛出 StackOverflowError 异常; 2. 如果虚拟机可以动态扩展, 如果扩展时无法申请到足够的内存, 就抛出 OutOfMemoryError 异常.
关于 OutOfMemoryError 参考博客: https://blog.csdn.net/hzy38324/article/details/76719105?utm_source=gold_browser_extension
2.3 本地方法栈
本地方法栈 (native method stack) 与虚拟街栈发挥的作用相似, 不同的是本地方法栈为 Native 方法服务.
2.4 java 堆
是 Java 虚拟机所管理的内存中最大的一块. 由所有线程共享, 在虚拟机启动时创建. 堆区唯一目的就是存放对象实例.
堆中可细分为新生代和老年代, 再细分可分为 Eden 空间, From Survivor 空间, To Survivor 空间. 在实现中可以扩展大小,(通过 - Xmx 和 Xms 控制)
如果在堆中没有内存完成实例并且堆无法扩展时, 抛出 OutOfMemoryError 异常
2.5 方法区
所有线程共享, 存储已被虚拟机加载的类信息, 常量, 静态变量, 即时编译器编译后的代码等数据.
当方法区无法满足内存分配需求时, 抛出 OutOfMemoryError
2.6 运行时常亮池
时方法区的一部分, Class 文件中除了有类的版本, 字段, 方法, 接口等描述, 还有一项就是常量池(constant pool table), 用于存放编译期生成的各种字面量和符号引用, 着不放会在类加载后放在方法区的运行时常量池中.
并非预置入 Class 文件中常量池的内容才进入方法运行时常量池, 运行期间也可能将新的常量放入池中, 这种特性被开发人员利用得比较多的便是 String 类的 intern()方法.
当方法区无法满足内存分配需求时, 抛出 OutOfMemoryError
来源: http://www.bubuko.com/infodetail-2758685.html