运行时数据区包括五部分: 程序计数器,JVM栈,本地方法栈,堆,方法区,前三种线程私有,后两种内存分配是动态的,所以GC只关注这两部分。
程序计数器:线程执行字节码的行号指示器,记录字节码指令地址,执行本地方法为空
JVM栈:方法执行时建立栈帧,存放 局部变量表,基本数据类型的值,对象引用,动态链接,方法出口
堆:存放对象实例,成员变量,数组值,分为新生代(包括三部分 Eden from to 8:1:1)和老生代 比例默认1:2
方法区:包括永久代(存放类信息),和运行时常量池(存放编译期生成的字面量和符号引用,运行时新的常量,String类的intern()方法就利用了这个特性),Java8之后用元空间代替运行时常量池,用本地内存空间来存储
每个区域异常原因:
堆:对象太多
栈:请求栈深度大于限制,比如很大的递归
方法区:永久代太多
内存泄漏:分配出的内存没有被回收回来,失去控制
内存溢出:程序所需内存超出系统分配上限
引用对对象的访问方式:1.句柄,引用指向实例数据指针和类型数据指针,这两个指针分别指向实例数据和对象类型数据
2.直接指针 引用指向实例数据和类型指针,指针指向类型数据
时间: 2024-10-17 08:50:33