运行时数据区域:
线程私有:
1.程序计数器
如果正在执行的方法为Native方法,程序计数器值为空。
2.java虚拟机栈
虚拟机栈描述java方法执行的内存模型:每个方法被执行时会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口。从方法的调用到执行完成,对应栈帧在虚拟机栈中入栈到出栈过程。
3.本地方法栈
与虚拟机栈作用相似。区别为虚拟机栈为虚拟机执行java方法服务,本地方法栈为虚拟机使用到的Native方法服务。
线程共有:
1.Java堆
存放对象实例,垃圾回收机制主要管理区域。
2.方法区
存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码
对象访问:
引用定位对象的访问方式
1.使用句柄
Java堆中会划分出一块内存作为句柄池,reference中存放对象句柄地址,句柄中包括对象实例数据和类型数据各自的具体地址信息
2.直接指针
使用直接指针访问方式,reference中直接存储对象地址,如上图。
垃圾收集
1. 引用计数法
虚拟机并未采用!!!
收集算法直接,但并不能解决循环引用带来的内存泄露。
2.根搜索算法
通过一系列GC ROOTS 对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径成为引用链,当某对象到GC ROOTS没有引用链相连时,则证明此对象不可用。
GCROOTS对象:
虚拟机栈(栈帧中的本地变量表)中的引用的对象。
方法区中的类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI(即Native方法)引用的对象。
引用类型:
强引用 > 软引用 > 弱引用 > 虚引用
本文内容参考自: 深入理解JAVA虚拟机
时间: 2024-10-11 17:20:52