zoukankan      html  css  js  c++  java
  • JAVA对象的生命周期(二)-对象的创建

    对象创建的几种方式

    • new
    • clone
    • newInstance
    • 反序列化
    • String s = "abc"(这个是比较特殊的)

    背景:接下来看下JAVA对象创建的整个过程,要理解每一步的意义,平时对基础知识还是要查缺补漏呀。先来看下整过过程的步骤。

    创建对象

    类加载检查。

    • 常量池定位new指令参数的符号引用
    • 检查这个符号引用是否被类加载,解析和初始化过,如果没有先进行类加载过程

    内存分配

    • 类加载过后对象所需的内存大小就能确定
    • 分配方式分为以下两种,基本原则是依据垃圾收集器是否压缩整理功能决定。
      • 指针碰撞,规整的内存区域沿一个方向移动指针分配即可
      • 空闲列表:JVM中记录一个已使用的列表,分配后再更新列表。
    • 内存分配的并发问题的两种方案
      • CAS+失败重试,CAS是一种乐观锁,每次不加锁而假设没有冲突的去完成某项操作,如果冲突则重试,直至成功,来保证原子性,缺点就是会出现频繁重试以至于浪费内存
      • TLAB:为每个线程先分配一段内存,JVM再给线程中的对象分配内存是现在TLAB中分配,当对象需要的内存大于TLAB时,再采用上述的CAS机制分配对象内存

    初始化零值

    • 内存分配完成后,虚拟机需要将分配的内存空间都初始化零值(不包括对象头)

    设置对象头

    • 初始化零值之后,虚拟机要对对象进行必要的设置,例如设置这个对象是哪个类的实例,如何找到类的元数据信息,对象的hash码,对象的GC分代年龄等,这些信息都是存放在对象头中。

    执行init方法

    • 上面工作做完后,在虚拟机角度这个对象实例已经创建完成,但是从java程序看来对象的生命周期才刚刚开始。
    • 执行INIT方法来按照程序员的意愿来初始化对象中变量的初值

    至此一个对象实例已经创建完成

    定位问题原因* 根据原因思考问题解决方案* 实践验证方案有效性* 提交验证结果
  • 相关阅读:
    21-while里的break简单用法
    20-使用while循环求从1累加至100的值
    19-random猜数
    18-random猜数,直到正确。
    17-简化后的石头剪刀布
    16-if实现石头剪刀布
    生成随机数
    转换数字的进制(Integer、Long)
    数字的舍入
    格式化数字
  • 原文地址:https://www.cnblogs.com/jimoliunian/p/12800640.html
Copyright © 2011-2022 走看看