对象类型在内存中的分配

  今天,我们来讲讲对象类型在内存中的分配

  对象类型和整型、字符串等类型一样,也是PHP中的一种数据类型,在程序中存储不同类型的数据,在程序运行时它的每一部分内容都要加载到内存中再被使用。那么对象类型的数据在内存中是如何分配的呢?咱们先来了解下内存结构,逻辑上内存大体被分为四段,分别为:数据段代码段,程序中不同类型数据的声明将会被存放在不同的内存段里面,每段内存的特点是这样的:

1、栈

  栈的特点就是空间小但被CPU访问的速度快,适合存放程序中临时创建的变量。由于栈的先进后出的特点,所以栈特别适合用于保存和恢复调用现场。从这个意义上讲,我们可以把栈看成是一个临时数据寄存、交换的内存区,一个用于存储占用空间定长且占用空间小的数据的内存段。例如整型1、100、1000等在内存中占用的空间是等长的,占用的空间都是32位4个字节。还有double、boolean等都可以存储在栈空间中。

2、堆

  堆是用于在程序运行过程中被动态分配的内存段,它的大小不固定,可动态地扩张或缩减。用于存储数据长度可变或占用内存比较大的数据。例如,字符串、数组和对象就存放在这段内存中。

3、数据段

  数据段用来存放可执行文件中已初始化的全局变量,换句话说就是存放程序中静态分配的变量。

4、代码段

  代码段用来存放可执行文件的操作指令,也就是说它是可执行文件在内存中的镜像。代码段需要防止程序在运行的过程中被非法修改,所以只准许读取操作,而不允许写入(修改)操作。例如,程序中的函数就存放在这段内存中。

  回过头来,我们来说说对象类型的数据在内存中如何分配的,对象类型的数据占用的空间比较大,且占用的空间不定长,所以对象创建完成以后被存放在堆内存中,但对象的引用名称存放在栈里面。程序在运行时,栈里的数据是可以直接存取的,而堆内存中的数据是不可以直接存取的,但可以通过对象的引用名称访问对象中的成员。

时间: 2024-08-06 11:54:52

对象类型在内存中的分配的相关文章

PHP对象类型在内存中的分配

对象类型和整型.字符串等类型一样,也是PHP中的一种数据类型.都是在程序中用于存储不同类型数据使用的,在程序运行时它的每部分内容都要先加载到内存中再被使用.那么对象类型的数据在内存中是如何分配的呢?先来了解一下内存结构.逻辑上内存大体被分为四段,分别为栈空间段.堆空间段.初始化数据段和代码段,程序中不同类型数据的声明将会被存在不同的内存段里面.每段内存的特点如下.①.栈空间段栈的特点是空间小但被CPU访问的速度快,是用户存放程序中临时创建的变量.由于栈的后进先出特点,所以栈特别方便用来保存和恢复

java对象在堆内存中的分配原则

1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC. 2.大对象直接进入老年代(大对象是指需要大量连续内存空间的对象).这样做的目的是避免在Eden区和两个 Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存). 3.长期存活的对象进入老年代.虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区. 4.动态判

JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java中的变量与数据类型”中的介绍,“变量是在内存中分配的保留区域的名称.换句话说,它是一个内存位置的名称”,也就是说我们通过这个变量名字就可以找到一个指向这个变量所引用的数据的内存指针,根据变量的类型我们可以知道这个指针之后的几个字节里存储了这个变量所引用的数据. 所以,了解变量在方法区.栈内存.堆内存

程序在内存中的分配方式

1 桟区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值,其操作方式类似于数据结构中的栈. 若申请的内存小于系统所剩内存则成功,否则就会发生栈溢出错误. 栈的增长方向是向下的,通常栈的初始化指针指向内存的最高地址,它是连续的.系统自动分配,因此速度很快. 在函数调用时,第一个进栈的是主函数的下一条指令的地址,然后是各个函数的参数,参数从右向左进栈,然后是函数中的局部变量.静态变量是不入栈的. 2 堆区(heap):一般有程序员分配和释放,若不释放,最后由操作系统回收. 它与

【转】float类型在内存中的表示

http://www.cnblogs.com/onedime/archive/2012/11/19/2778130.html http://blog.csdn.net/adream307/article/details/7246993 http://wenku.baidu.com/link?url=Q_SYeQffEjdS1cpMXIRncmmhwKA_o2978-0ei1_gz9ym2vrmmBrSEZArpE6tR4yCB9PEHLG_FHRakijbr9-Y0DIK_MTjBUTKoXUh

float类型在内存中的表示

先说一下计算机中二进制的算法: 整数 整数的二进制算法大家应该很熟悉,就是不断的除以2取余数,然后将余数倒序排列.比如求9的二进制: 9/2=4 余 1 4/2=2 余 0 2/2=1 余 0 1/2=0 余 1 一直计算到商为0为止,然后将得到的余数由下到上排列,就得到了9的二进制:1001. 从上面的算法我们可以看到,用整数除以2,最终都能够到0.因此,整数是可以用二进制来精确表示的. 小数 小数的二进制算法和整数的大致相反,就是不断的拿小数部分乘以2取积的整数部分,然后正序排列.比如求0.

数组及其在内存中的分配

1.一维数组 ● 数组概念:数组是储存同一种数据类型多个元素的集合.也可以看成是一个容器.它既可以存储基本数据类型,也可以存储引用数据类型. ● 定义格式1: 数据类型[] 数组名:       格式2: 数据类型 数组名[]; ● 数组的初始化.动态初始化 数组的初始化:数组必须先初始化,然后才能使用,就是为数组中的数组元素分配内存空间,并为每个数组元素赋值 初始化分类: (1)动态初始化:只指定长度,由系统给出初始化值: (2)静态初始化:给出初始化值,由系统决定长度. 注意:这两种方式只能

PHP对象在内存中的分配

在网上看到一篇关于php对象在内存中分配的博文,特地记录下来,再稍微修饰下. 对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢? 内存从逻 辑上 说大体上是分为4 段,栈空间段.堆空间段.代码段.初始化静态段,程序里面不同的声明 放在不同的内存段里面. 数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量: 代码段(code segment / te

PHP面向对象(PHP对象在内存中的分配)

对 像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻 辑上 说大体上是分为4 段,栈空间段.堆空间段.代码段.初始化静态段,程序里面不同的声明 放在不同的内存段里面,数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量:代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域,比如函数和方法: