JAVA 内存区域 笔记

MemoryArea.png

程序计数器(Program Counter Register)

Java方法:正在执行的虚拟机字节码指令的地址
Native方法:空(Undefined)
当调用Native方法时,会新启动一个线程来执行,并阻塞当前Java线程,等待Native方法结束。
所以当执行Navtive方法时,程序计数器为空,不会有任何影响
唯一无OOM区域

Java虚拟机栈(Java Virtual Machine Stacks):为Java方法(字节码)服务

每个方法在执行的同时会创建一个栈帧(Stack Frame)
栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息
局部变量表用于存放编译器克制的各种基本数据类型、对象引用和returnAddress类型(指向一条字节码指令的地址)
StackOverflowError:栈深度 > 虚拟机允许的深度
OutOfMemoryError

本地方法栈(Native Method Stack):为Native方法服务

Sun HotSpot:把Java虚拟机栈与本地方法栈合二为一
StackOverflowError、OutOfMemoryError

Java堆(Java Heap)

虚拟机启动时创建,所有对象实例以及数据都要在堆上分配
随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致所有的对象都在堆上分配变得不再那么绝对
线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)
OutOfMemoryError

方法区(Method Area):JDK7.0之后被移除

类信息:迁移至元空间
常量、静态变量:迁移至Java堆
即时编译器编译后的代码:迁移至Java堆(猜的)

运行时常量池(Running Constant Pool)

存放编译期生成的各种字面量和符号引用
JDK6.O及之前位于方法区
JDK7.O及之后位于Java堆

直接内存(Direct Memory)

JDK4.0中引入了NIO(New Input/Output)
避免了在Java堆和Native堆中来回复制数据
JDK7.O及之后引入元空间(Metaspace)

你可能感兴趣的:(JAVA 内存区域 笔记)