Java内存区域
程序计数器
- 当前线程执行字节码的行号指示器
虚拟机栈
描述Java方法执行的内存模型。每个方法被执行的时会创建一个栈帧,栈帧是用于支持方法调用和方法执行的数据结构。活动线程中,栈顶的栈帧才有效,执行引擎所运行的所有字节码指令都针对当前栈帧进行操作。栈帧用于存储局部变量表,操作数栈,动态链接,方法返回地址等。局部变量表的大小,操作栈深度都在方法表的Code属性中。
- 局部变量表
用于存放方法参数和方法内部定义的局部变量,对象引用和returnAddress类型 - 操作数栈
方法开始执行时,它的操作数栈是空的,执行过程中,会有各种字节码指令向操作栈中写入和提取,也就是入栈和出栈 - 动态链接
指向运行时常量池中该栈帧所属方法的引用 - 方法返回地址:
Java堆
方法区
内存溢出,(1)出现的代码写法,无限循环new对象,并将引用保存在list中(2)出现原因
内存泄漏和内存溢出的区别
内存泄漏是指分配出去的内存没有回收,失去了对该内存区域的控制,造成了资源的浪费
内存溢出是指程序所需内存空间超出系统所能分配的内存空间
垃圾回收
什么时候垃圾回收,没有引用了就被回收了吗?如果一个类中,存在着全局的一个类的引用,那么对象什么时候被回收,这个类的对象被回收时?比如a.b,b什么时候被回收,在a被回收的时候吗?
怎么为线程分配栈空间?
Java堆中对象实例数据怎么存储,存储的都是什么?
栈是线程私有的,怎么体现出来的?
操作数栈存储什么?怎么存储?
类什么时候被加载?