java虚拟机

java虚拟机的组成

线程隔离,每个线程分布独立的栈空间。

栈帧

栈由一个个栈帧组成,进入到另一个方法时新开辟一个栈帧

  1. 局部变量表:记录局部变量值
  2. 操作数栈:存放临时操作数,将需要运算的变量值加载出来,运算数从栈顶弹出值,得到结果后压回栈内
  3. 动态链接:指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接
  4. 方法出口:存放上一层方法执行的对应行号,当前方法结束后回到该行继续执行
  • 程序计数器

线程隔离,记录当前线程运行位置行号,每执行完一行代码由字节码执行引擎修改行号,线程挂起后切回,从记录的行号继续执行。

  • 本地方法区 

线程隔离,存放本地方法数据。

  • 方法区(元空间)

线程共享,存放常量、静态变量、类信息

新生代

默认占整个堆的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

  1. Mark Word(标记字段)自身运行时数据:哈希值;GC分代年龄;锁状态标志;线程持有锁;偏向线程ID;偏向时间戳;
  2. Class Pointer(类型指针):类的元数据指针
  3. 数组长度(只有数组对象才有)
原文地址:https://www.cnblogs.com/ren-kai/p/12879411.html