zoukankan      html  css  js  c++  java
  • JVM学习笔记——对象的创建过程

    title: JVM学习笔记——对象的创建过程
    date: 2018/9/1 16:01:35
    description: 最近开始着手JVM的学习,在这里把自己学习过程中的笔记分享出来,希望能帮到一些小伙伴,同时也是对自己的学习的一个梳理。

    对象的创建过程

    1. 检查该类是否已经被加载、解析、初始化,没有则执行类加载。(详细类加载的过程稍后再做介绍)

    2. 类加载检查通过后,从Java堆中划分出一块空间,为对象分配内存。(所需内存大小在类加载完成后可确定)Java堆根据所采用的垃圾收集器内存空间有所不同,分为规整与不规整两种情况。

      • 规整的情况,使用过的内存放在一边,空闲的内存在另一边,中间以一个指针作为分界,分配时移动分界指针即可,这种分配方式称为“指针碰撞”(Bump the Pointer)。

      • 非规整的情况,使用与空闲的内存相互交错,虚拟机需要维护一个记录空闲内存空间的列表,分配时从列表中寻找空间划分,这种分配方式称为“空闲列表”(Free List)。

      • 因为涉及到临界数据(分界指针&空闲列表)的修改,所以内存分配时并不是线程安全的,通常有两种解决方案。

        • 在分配内存空间的动作处进行同步处理。
        • 采用本地线程分配缓冲(Thread Local Allocation Buffer,TLAB),每个线程在堆中预先分配一小块内存,只有这块内存用完后需要重新申请时,才进行同步锁定。TLAB可以通过-XX:+/-UseTLAB来设定。

    3. 为内存空间进行初始化为零值,设置各类变量的默认初始值。

    4. 对象头信息设置:GC分代年龄、对象的哈希码、是哪个对象的实例等等。

  • 相关阅读:
    Spring MVC 入门示例讲解
    使用Word2013,发布博文到博客园
    走过2103,迈向2014
    C#中的字符串拼接@,$
    ORA-22922:nonexistent LOB value问题及listagg()函数
    证明一个数是不是存在于该数组中
    论java中System.arrayCopy()与Arrays.copyOf()的区别
    JSP中获取各种路径的方法
    JavaScript中变量声明有var和没var的区别
    JavaScript:理解事件循环
  • 原文地址:https://www.cnblogs.com/qbzf-Blog/p/9570738.html
Copyright © 2011-2022 走看看