Java运行时数据区结构
-(A)PC寄存器/程序计数器(每个线程有一个独立的程序计数器,且互不影响,独立储存)
- (a)保存当前正在执行的程序的内存地址。
-
(B)Java栈 Java Stack(每条线程对应一个栈,一个栈中对应多个栈帧,执行一个方法压入一个栈帧,结束一个方法出一个栈帧)
-
- (a)栈帧是每个方法关联起来的,每运行一个方法就创建一个栈帧,每个栈帧会含有一些局部变量,每当一个方法执行完成时,该栈帧就会弹出这个栈帧的元素作为这个方法的返回值,并清除这个栈帧。
- (b)Java栈顶的栈帧就是当前执行的活动栈,也就是正在执行的方法,PC寄存器会指向该地址
。
- (c)栈帧的结构:局部变量表,操作数栈,动态连接方法,返回的地址
- (C)堆 Heap(堆时JVM所管理的内存中最大的一块,被所有的Java线程锁共享,不是线程安全的,在JVM启动时创建)
- (a)所有对象实例以及数组都要在堆上分配。
- (b)Java堆时GC管理的主要区域,现在GC基本都采用
分代收集算法
,所有堆还可以细分为:新生代和老年代新生代再细致一点有
Eden空间,From Survivor空间,To Survivor空间`等。
- (D)方法区Method Area(方法区存放了要加载类的信息(名称,修饰符等)类中定义为静态常量,类中的Field信息,类中的方法信息,
方法区是被Java线程共享的
)- (a)方法区数据虽然时被线程共享,但是不会像Java堆一样被GC频繁回收,它储存的信息相对比较稳定,再一定条件下会被GC
- (E)常量池Constant Pool(
常量池本身是方法区的一个数据结构。
)- (a)常量池中储存了如字符串,final变量值,类名和方法名变量值。常量池在编译期间就被确定,并保存在已编译的。class文件中。
- (F)本地方法栈Native Method Stack(本地方法栈和Java栈所发挥的作用非常相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行Native方法服务。本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。)
- (C)堆 Heap(堆时JVM所管理的内存中最大的一块,被所有的Java线程锁共享,不是线程安全的,在JVM启动时创建)