您的位置 首页 java

Java与PHP新建对象时的内存对比

内存:

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。

Java

Java与PHP新建对象时的内存对比

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

JVM的内存划分:

Java与PHP新建对象时的内存对比

Java与PHP新建对象时的内存对比

一个对象,调用一个方法内存图

Java与PHP新建对象时的内存对比

通过上图,我们可以理解,在栈内存中运行的方法,遵循”先进后出,后进先出”的原则。变量p指向堆内存中的空间,寻找方法信息,去执行该方法。

但是,这里依然有问题存在。创建多个对象时,如果每个对象内部都保存一份方法信息,这就非常浪费内存了,因为所有对象的方法信息都是一样的。那么如何解决这个问题呢?请看如下图解

两个对象,调用同一方法内存图

Java与PHP新建对象时的内存对比

对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。

一个引用,作为参数传递到方法中内存图

Java与PHP新建对象时的内存对比

引用类型作为参数,传递的是地址值。

PHP:

Java与PHP新建对象时的内存对比

内存从逻辑上说大体上是分为4 段,栈空间段、堆空间段、代码段、初始化静态段,程序里面不同的声明放在不同的内存段里面。

数据段(data segment)通常是指用来存放程序中已初始化且不为0的 全局变量 如: 静态变量 和常量;

代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域,比如函数和方法;

栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。
堆内存,数据长度不定长,而且占有空间很大的数据类型的数据。如下图:

Java与PHP新建对象时的内存对比

栈内存是可以直接存取的,而堆内存不可以直接存取。
对于我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象了。
一个类可以实例出多个对象,每个对象都是独立的,
实例出来3 个人来,每个人之间是没有联系的,只能说明他们都是人类,每个人都有自己的姓名,性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体现出来的成员属性和成员方法, 实例化 出来的对象里面就包含了这些属性和方法。
$p1=new Person(); $p2=new Person(); $p3=new Person();
对于这个条代码,$p1 是对象名称在栈内存里面new Person()是真正的对象是在堆内存 里面的,具体的请看下图:

Java与PHP新建对象时的内存对比

从上图可以看出$p1=new Person();等号右边是真正的对象实例,在堆内存里面的实体,
上图一共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,每个对象之间都是相互独立的,使用自己的空间,
在PHP 里面,只要有一个new 这个关键字出现就会 实例化出来一个对象,在堆里面开辟一块自己的空间。
每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓名、性别和年龄。每个属性又都有一个地址。
$p1=new Person();等号的右边$p1 是一个引用变量,通过赋值运算符“=”把对象的首地址 赋给“$p1”这个引用变量,所以$p1 是存储对象首地址的变量,$p1 放在栈内存里边,$p1 相当 于一个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也 称对象引用为对象。

文章来源:智云一二三科技

文章标题:Java与PHP新建对象时的内存对比

文章地址:https://www.zhihuclub.com/182698.shtml

关于作者: 智云科技

热门文章

网站地图