一、jvm组成
1. 本地变量表
this居然也会占用一个槽slot
局部变量表的槽会被复用!!!但形参和this好像不会被复用
在一个方法的执行上下文中,形参和this
的Slot都不会被复用。Slot的复用通常发生在不同变量的作用域重叠时,例如一个局部变量在其作用域结束之后,后续在同一作用域层次声明的局部变量可能会复用之前变量释放的Slot。
2. 操作数栈和帧数据
操作数栈也是一种栈结构。
iadd 会将操作数栈顶端的两个元素弹出来相加,然后再次放入操作数栈。
异常表标明的异常表的生效范围,即在哪些指令之间 去捕获对应的异常。
在JVM字节码中,astore_<n>
指令用于将一个引用类型(如对象引用)从操作数栈存储到局部变量表的第n
个槽位中。例如,astore_1
指令就是将栈顶的引用类型值存储到局部变量表的第1个槽位。这里的a
代表"reference"类型(即对象引用或数组引用),store
表明这是一个存储操作,而1
是槽位索引。
3. 栈内存溢出
元空间独立于java虚拟机之外。位于操作系统维护的内存
二、 垃圾回收
1. 自动垃圾回收
与手动垃圾回收相比: 减少心理负担,但回收不及时。
应用场景如下:
2. 方法区的回收
①类加载器不再使用
②所加载的类的实例对象不再使用
③所加载类的java.lang.class不再使用
手动触发回收,仅仅是发送一个回收请求
3.引用计数法
如果使用引用计数法,
在栈内,a1引用了A的实例对象,b1引用了B的实例对象,计数器分别+1
在堆内A的实例对象引用了B的实例对象,B的实例对象也一样,计数器分别+1
此时,a1=null.A的计数器-1 , b1=null , B的计数器-1
此时计数器分别为1,无法被回收。
所以,java采用的是另一种方式。