• 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. 数组长度(只有数组对象才有)
  • 相关阅读:
    【转载】实时嵌入式软件开发的25个常见错误
    软件测试高级测评师培训-白盒测试所用工具
    SQL update select语句
    JS对URL字符串进行编码/解码分析
    Java利用jacob实现文档格式转换
    Web打印--Lodop API
    常用正则表达式
    截取视频第一帧作为预览图片
    plupload api
    URL特殊字符的转义
  • 原文地址:https://www.cnblogs.com/ren-kai/p/12879411.html
Copyright © 2020-2023  润新知