JVM:java运行时数据区和内存结构
一、运行时数据区
- 类加载器:JVM启动或类运行时将class文件加载到JVM中
- 执行引擎:负责执行class文件中的字节码指令
- 内存区:即运行时数据区
- 本地接口:主要是调用C或C++实现的本地方法
一)堆
是Java虚拟机所管理的内存中最大的一块。由所有线程共享,在虚拟机启动时创建。堆区唯一目的就是存放对象实例。
是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。
二)方法区
jdk1.8后被叫做元空间。
三)程序计数器
当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环等都依赖这个计数器。
唯一没有规定任何OutOfMemoryError情况的区域。
四)java虚拟机栈
每个方法被执行时会创建一个栈帧,用于存放局部变量表等等,当该方法被执行完成时,就完成在栈帧中的入栈和出栈。
规定的异常情况有两种:1.线程请求的栈的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;2.如果虚拟机可以动态扩展,如果扩展时无法申请到足够的内存,就抛出OutOfMemoryError异常。
五)本地方法栈
虚拟机使用到native方法。用native修饰符
二、内存结构
一)堆内存
- 线程共享
- 分为年轻代和年老代
- 年轻代又分为:Eden、From Survivor、To Survivor
EdenSpace:伊甸园,对象刚刚被创建时存储的区域;
From Survivor和To Survivor是大小相等的两块区域,在同一时间节点只有一个区域存有数据。
二)方法区
线程共享。也叫永久代。
三)栈内存
- 线程私有
- 包括Java虚拟机、本地方法栈、程序计数器