美文网首页
1.认知Java虚拟机

1.认知Java虚拟机

作者: _少年不知愁 | 来源:发表于2020-12-28 09:40 被阅读0次

    1.jdk结构

    1.jdk(Java Development Kit)包含Java工具,Java基础的类库和jre
    jre(Java Runtime Enviromental)包含核心类库和jvm
    jvm(Java Virtual Mechinal)

    image.png
    jdk 版本下载

    2.java是跨平台的语言

    image.png

    3.核心(jvm整体结构和内存模型)

    image.png

    4.hotSpot虚拟机对象探秘

    参考 见深入java虚拟机第二章的2.3

    4.1 对象的创建

    1.对象创建方式:
    使用new关键字,使用Class的newInstance方法,使用Constructor类的newInstance方法,使用clone方法,
    使用反序列化;
    2.创建过程
    虚拟机遇到new指令,首先去检查这个符号引用的的类是否被加载,解析和初始化,类加载通过后分配内存空间。
    若Java堆中内存是绝对规整的,使用“指针碰撞“方式分配内存;如果不是规整的,就从空闲列表中分配,
    叫做”空闲列表“方式;
    划分内存时还需要考虑一个问题-并发,也有两种方式: CAS同步处理,或者本地线程分配缓冲
    (Thread Local Allocation Buffer, TLAB)。
    然后内存空间初始化操作,接着是做一些必要的对象设置(元信息、哈希码…),最后执行<init>方法
    

    4.2 对象内存布局

    大致分成三块区域:对象头 实例数据 和对齐填充

    1.对象头
    第一部分,Mark word,用于存储对象自身运行时的数据,
    如哈希码,gc分代年龄,锁状态标志,线程持有锁,偏向线程id,偏向时间戳
    另一部分类型指针,即对象指向它的类元数据的指针,(用于确定对象类型)
    
    2.实例数据
    
    3.对齐填充
    对象字节是否能被8整除,否则自动填充到能被8整除
    

    4.3 对象访问定位

    指程序需要通过JVM上栈的引用访问堆中的具体对象;

    主要使用句柄池和直接指针;

    Java堆中划分出一块内存来作为句柄池,引用中存储对象的句柄地址,而句柄中包含了对象实例数据对象类型数据各自的具体地址信息,具体构造如下图所示

    访问定位-句柄池.jpg
    访问定位-直接指针.jpg

    相关文章

      网友评论

          本文标题:1.认知Java虚拟机

          本文链接:https://www.haomeiwen.com/subject/dbvzjqtx.html