java虚拟机的组成
-
栈
线程隔离,每个线程分布独立的栈空间。
栈帧
栈由一个个栈帧组成,进入到另一个方法时新开辟一个栈帧
- 局部变量表:记录局部变量值
- 操作数栈:存放临时操作数,将需要运算的变量值加载出来,运算数从栈顶弹出值,得到结果后压回栈内
- 动态链接:指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接
- 方法出口:存放上一层方法执行的对应行号,当前方法结束后回到该行继续执行
-
程序计数器
线程隔离,记录当前线程运行位置行号,每执行完一行代码由字节码执行引擎修改行号,线程挂起后切回,从记录的行号继续执行。
-
本地方法区
线程隔离,存放本地方法数据。
-
方法区(元空间)
线程共享,存放常量、静态变量、类信息
-
堆
新生代
默认占整个堆的1/3
- 伊甸区:默认占新生代8/10。当空间不足时进行垃圾回收。
- 幸存区:默认占新生代2/10
老年代
默认占整个堆的2/3
垃圾回收
可达性分析算法:将GC Roots对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,未标记的则为垃圾对象。(GC Roots:线程的本地变量、静态变量、本地方法栈的变量等都可以作为根节点)。
minor gc:当伊甸区空间不足时就会触发,将伊甸区和from区标记的非垃圾对象复制到to幸存区,垃圾对象销毁。如果to被占满了,剩下的非垃圾对象被直接移动到老年代。同时在对象的Object Header(对象头)的标记字段(Mark Word)将此对象的GC年龄加一。幸存区分为from和to,每次gc时这两个区就互换身份。再次发生gc时重复此过程。默认(由参数--XX:MaxTenuringThreshold=15 决定)当一个对象的年龄超过15时被放入老年代。
full gc:当老年代空间不足时触发。
(补充)Object Header
- Mark Word(标记字段)自身运行时数据:哈希值;GC分代年龄;锁状态标志;线程持有锁;偏向线程ID;偏向时间戳;
- Class Pointer(类型指针):类的元数据指针
- 数组长度(只有数组对象才有)