Java-虚拟机学习
阅读《深入理解Java虚拟机》记录概要
随笔记录点Java虚拟机的内存区域方法区线程共享,存放着已被虚拟机加载的类信息、常量、静态常量、即使编译后的代码等数据
运行时常量池属于方法区,存放着编译期间生成的各种字面量和符号引用
虚拟机栈描述方法执行的内存模型,线程私有。即每个方法执行的时候会产生栈帧,栈帧中存储着局部变量表(基础类型、引用)、操作栈、动态链接、方法出口,一个方法的调用到执行就是一个栈帧在虚拟机栈中的入栈到出栈过程。
对于方法执行过程中线程请求栈的深度大于虚拟机允许的限度时会产生栈溢出异常(StackOverflowError),一般允许扩展深度,当内存不足无法申请到内存以扩展深度时则会发生内存溢出异常(OOM)。
本地方法栈和虚拟机栈很类似,只不过是服务于本地方法(Native)作用。
堆线程共享,存放着对象实例,所有的对象和数组都要在堆上分配,也是GC管理的主要区域。方便GC,更为细致可以分为新生代、老年代。Eden、from、to,总之进一步的划分是为了更好的进行垃圾回收。
程序计数器通过程序计数器来记录程序的执行位置,存储着指令的地址。
线程切换需要回到正确的执行位
...