第2章 java内存区域和内存溢出异常
运行时区域划分:本地方法栈、java虚拟机栈、程序计数器、方法区、堆
程序计数器:线程私有,一个程序计数器,用于记录编译后代码执行到哪,cpu之执行一条指令的时候,记录其他指令挂起和恢复位置
java虚拟机栈:线程私有,生命周期跟线程相同,方法被执行的时候,都会创建一个栈,局部执行中间值、中间状态等都会存储,每个方法从被调用到结束,都对应一个入栈、出栈的过程,存有局部变量表,通过变量槽表示,这个区会抛出StackOverflowError(栈深度溢出)异常和OutOfMemoryErrory(栈扩展失败)异常
本地方法栈:和虚拟机栈类似(都是执行字节码),只是该区只是虚拟机使用本地方法的时候才服务,这个区会抛出StackOverflowError(栈深度溢出)异常和OutOfMemoryErrory(栈扩展失败)异常
java堆:最大内存,所有线程共享内存,存放对象实例,是垃圾回收器管理的内存区域,被实现可以固定大小,也可以动态扩展,如果内存用完再创建或者扩展时,会抛出OutOfMemoryErrory(扩展失败)
方法区:各线程共享区域,用于存放类型信息、常量、静态变量、即时编译后的代码缓存等数据,
运行时变量池是方法区的一部分,OutOfMemoryErrory(扩展失败)
HotSpot虚拟机对象探索
对象创建:当虚拟机遇到new字节码时,先去变量池中定位到一个符号引用,并且这个符号引用代表类是否被加载、解析、初始化,如果没有那必须要执行类加载,分配内存是从java堆中分配,分配方式分为:指针碰撞、空闲列表
对象访问方式:句柄访问、直接指针访问