深入理解JVM Note
第2章 Java内存区域与内存溢出异常 运行时数据区域 在虚拟机有栈、堆和方法区。 线程共享的:堆、方法区 不共享的:栈、程序计数器(代码执行的行号) 程序计数器(Program Counter Register): 一小块内存空间,单前线程所执行的字节码行号指示器。字节码解释器工作时,通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 栈 通常我们定义一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间。 栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。 存在栈中的数据可以共享。假设我们同时定义: int a = 3; int b = 3; 编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,如果没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。 StackOverflowError 方法压入和弹出 连续 1.引用类型总是被分配到“堆”上。不论是成员变量还是局部 2.基础类型总是分配到它声明的地方:成员变量在堆内存里,局部变量在栈内存里。 比如