zoukankan      html  css  js  c++  java
  • [java]对象创建的过程

    解析字节码

     虚拟机解析字节码指令遇到new指令,开始创建创建一个对象。
    

    检测类是否已经加载

    检查类型是否能在常量池中定位到符号引用,检测这个符号引用所对应的类是否已经加载,解析和初始化,如果未完成,则先执行类加载的过程。

    检测过类存在后,给新生对象分配内存空间

    分配方式分两种

    a. 指针碰撞,所有用过内存放在一边,中间使用一个指针做标记。每次开辟内存就是将标示向空闲区域移动对象大小的空间。 (有内存压缩整理的垃圾手机,Serial,ParNew)
    b. 空闲列表 如果内存不是连续的,就不能使用指针碰撞,就需要维护一个类似表,记录空闲的内存列表 (不具有压缩内存的收集器 主要指的CMS这种手机)

    具体使用a,或者b

    创建对象中的线程安全问题

    a. 指针碰撞: 多个线程可能同时操作一个指针,造成的线程安全问题。

    解决方法 给操作指针的方法添加同步

    b. 预分配,给每个线程预先分配一个空间,每个线程都再自己内存空间内分配,保存每个空间都是单线程操作。(Thread Local Allocation Buffer TLAB)可以使用+UseTLAB。同事TLAB还有一些相关设置

    TLAB的其他设置

    XX:+UseTLAB开启TLAB

    XX:TLABWasteTargetPercent设置TLAB空间所占用Eden空间的百分比大小。

    TLAB 会造成空间浪费和 TLAB遇到大对象的时候可以再次申请TLAB但是如果这时候Eden空间不足的时候,会触发GC

    对象初始化

    1. 内存分配完成之后,初始化对变量值初始化0
    2. 对对象头(Object Header) 设置Hash 和GC等分代信息。包括偏向锁等
    3. 对象执行方法,完成彻底得数据初始化。
  • 相关阅读:
    UnityWebgl错误-Uncaught DOMException: Blocked a frame with origin "" from accessing a cross-origin frame
    【Oracle123】v$sql 视图
    【QA123】ISO9126软件质量模型
    【测试工具123】HP LoadRunner
    【CSV123】如何使用Excel打开CSV并保留大数字精度
    【Java123】
    【FRM-Level2】2020 FRM二级考纲变化
    【FRM-Level2】2020 FRM二级 Current Issues
    【Oracle123】Oracle数据导入导出
    【中间件123】消息队列性能对比
  • 原文地址:https://www.cnblogs.com/anycc/p/14672014.html
Copyright © 2011-2022 走看看