JVM内存结构
栈
JVM栈
jvm栈是为java服务的
- 栈的作用: 存放基本类型变量 , 局部变量 , 对象的引用
- 栈的特点如下:
1.自动分配与回收内存
2.是一块连续的内存的区域,有大小限制,如果超过了就会栈溢出,并抛出栈溢出的异常StackOverflowErro;
3.线程私有
栈帧 :
是java方法的内存模型 , 每个方法执行都会创建一个栈帧 , 入栈; 方法调用结束 , 出栈
栈帧堆满了栈会报异常, 如下面代码:
public class Test01 { private static int stacklength = 0; public static void main(String[] args) throws Throwable { try { Test01 t = new Test01(); t.stackOverFlow(); } catch (Throwable e) { System.out.println(stacklength); throw e; } } //递归调用 public static void stackOverFlow() { stacklength++; stackOverFlow(); } }
本地方法栈
为native方法服务
堆
堆分为新生代和老年代 , 又可细分为 Eden空间、From Survivor空间、To Survivor空间 ; 在运行时动态分配内存
- 堆的作用 : 存放new创建的对象和数组
- 堆的特点如下:
1.是不连续的内存区域, 当堆无法分配空间时,抛出OutOfMemoryError
2.由自动垃圾回收器来管理
3.线程共享
方法区
可以看做是堆内存的扩展
- 方法区的作用 : 存储常量 , 类信息
程序计数器
- 程序计数器的作用 : 是行号指示器, 记录当前线程字节码的执行行数
- 特点如下:
1.线程私有 2.对应java方法, 记录的是指令的地址; 对于native方法, 记录器的值为0
祝:
大家生活愉快,工作顺利