zoukankan      html  css  js  c++  java
  • 深入理解java虚拟机---对象的创建过程(八)

      1.对象的创建过程

    由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程.

     注意: 最后一步的init方法是代码块和构造方法.

    以上是总图,下面分步骤详细讲解

    A: 虚拟机为对象分配内存方式

      1. 指针碰撞: 堆内存规整时,这时就可以把其看做一半连续内存被占用,一半连续的内存空闲.所以当创建新对象时,从空闲的内存中分配空间给新对象

      2.空闲列表: 堆内存是不连续的,这就需要虚拟机维护一个内存列表,用于记录当前内存是否被占用,当新创建对象时,查询这个表看哪里有空闲并分配给新对象占用,所以这种方式就叫做空闲列表

    虚拟机选择哪种内存分配方式主要看堆内存是否规整.堆内存是否规整则是有垃圾回收器策略确定.当垃圾回收器策略可以实现将堆内存清理的很规整,那么虚拟机就使用指针碰撞方式,否则使用空闲列表方式

    B:线程安全问题

    在高并发时,同时堆内存创建多个对象.当空闲列表中一个空闲内存分配给其中一个对象,但是还没来得及更新空闲列表.这时新的对象进来也被分配相同的内存空间.那么就会产生线程安全问题.

    解决方式:

      A: 使用线程同步(加锁),一个线程进来,加锁.不让第二个线程进来

      B; 本地线程分配缓存: 将堆内存为每个线程分配单独的区域,即每个线程操作各自的区域,各不影响.

    C:初始化对象

     任何对象创建后,都有会初始化值.此步骤后对象已经在堆中存在

    D: 执行构造方法

    构造方法为对象中的属性赋值.

  • 相关阅读:
    winform只允许一个应用程序运行
    IIS配置文件的XML格式不正确 applicationHost.config崩溃 恢复解决办法
    C#ToString() 格式化数值
    SQLServer2008只能编辑前面200行数据
    Validform验证时可以为空,否则按照指定格式验证
    js操作cookie
    div z-index无论设置多高都不起作用
    Tableau 练习题
    Tableau可视化操作
    Tableau 基础
  • 原文地址:https://www.cnblogs.com/zhulibin2012/p/8988104.html
Copyright © 2011-2022 走看看