• 基元类型、值类型和引用类型


    基元类型(primitive type)
    ----------------------------------
    编译器直接支持的类型。

    sbyte / byte / short / ushort / int / uint / long / ulong / char / float / double / bool / decimal / object / string

    值类型(value type)
    ------------------------------
    值类型实例分配在堆栈(stack)上,值类型变量本身即包含实例所有字段,值类型不受垃圾回收器控制,在离开作用域后自动释放所占内存。所有值类型都继承自ValueType。值类型缺省状态下(未装箱)按值复制方式传递。

    sbyte / byte / short / ushort / int / uint / long / ulong / char / float / double / bool / decimal / 枚举(enum) / 结构(struct)

    引用类型(reference type)
    ------------------------------------
    引用类型都全部或间接继承自Object,引用对象内存必须在托管堆(heap)中分配,引用类型变量包含对象在托管堆中的内存地址。每个引用类型对象实例都包含一些额外附加成员,且需要垃圾回收器回收才能释放内存。注意,引用本身在堆栈中分配。引用类型对象传递时只是复制引用(内存地址)。

    引用对象(Object) / 数组(String) / 数组(Array) / 装箱后的值类型

    装箱步骤
    -------------
    1. 从托管堆分配内存,包括添加方法表指针和SyncBlockIndex。
    2. 将值类型字段拷贝到该内存。
    3. 返回该地址的引用。

    拆箱步骤
    ------------
    1. 如果引用为null,抛出NullReferenceException。
    2. 如果目标不是已装箱的值类型,抛出InvalidCastException。
    3. 返回指向包含在已装箱对象中值类型部分的引用,而不是重新在堆栈建立值类型实例,因此需要GC回收才能释放。

    栈(stack)
    ------------
    位于常规内存区(general random-access memory),处理器可以通过栈指针(stack pointer)对它进行直接访问。指针向下移动创建新的存储空间,向上释放存储空间。是仅次于寄存器(registers)的最快、最有效率的分配内存方法。一般用来存储那些已知大小的值类型和引用,栈中分配的数据在超出作用域后自动被释放。

    堆(heap)
    ------------
    这是一段多用途内存池(general-purpose pool of memory)。堆的优点是分配内存时编译器无需知道该分配多少空间,以及数据的生存期。在堆中分配的对象必须通过垃圾回收期回收后才能释放,因此效率要比栈低一些。
  • 相关阅读:
    JAVA 基础 / 第二十三课: 类和对象 / 什么是JAVA中的方法重载? 构造方法?
    JAVA 基础 / 第二十二课: 类和对象 / 什么是JAVA中的引用? 继承 ?
    【Oracle】ORA-12518, TNS:listener could not hand off client connection
    Oracle 将当前系统时间戳插入timestamp字段 无效的月份
    Git本地有未提交文件,直接拉取远端最新版本
    Windows下分布式环境搭建以及简单测试
    Python——pip快速下载第三方库到指定环境
    Python——Scrapy爬取链家网站所有房源信息
    Python——XPath提取某个标签下所有文本
    Python——全国瓜子二手车数据分析
  • 原文地址:https://www.cnblogs.com/huige1004/p/1320203.html
Copyright © 2020-2023  润新知