内存模型?

版权声明:禁止转载 https://blog.csdn.net/qq_36505948/article/details/82790585

一、数据类型与“引用值”定义?

数据类型分为基本类型(基本数据类型,堆中对象引用)和引用类型(类类型,接口类型,数组)。基本数据类型在栈中,引用类型在堆中!
基本类型的变量保存的是原始值,他代表的值就是数值本身,而引用类型里的变量保存的是引用值。这里的引用值可以理解为被引用对象的地址码,它是一个实际存在的原始值!


二、堆栈模型解析?

堆栈模型分为堆和栈。栈是运行时的单位而堆是存储的单位。栈解决的是程序运行以及如何处理的逻辑问题,堆处理的是数据存储的问题(放哪里,怎么放)。
在java中,每一个线程都会有一个独立的线程栈,正是因为栈是运行单位,里面存储的是与数据和当前状态有关的变量信息等待,而堆只是负责存储对象!


三、为什么要划分堆栈呢?堆栈到底有什么好的? 

堆栈划分原因解析如下:

1.将逻辑和数据分开管理,使得调理清晰。栈是负责逻辑,堆负责数据!
2.堆栈分离,使得堆中的东西可以被多个逻辑共享
3.栈大部分用于保存逻辑等上下文信息,其空间是向上增长的,且容量有限。而堆随着数据而动态增长,职能专一
4.堆栈的分离使得对象的完美诞生,对象分行为和属性,属性本质上是存储于堆中的数据,行为属于数据逻辑,存储于栈中。


四、数据类型就那么些,堆中具体存储的是什么?栈中具体存储的又是什么?

(具体图像依旧观察二之中的图形)

1.堆中存的是对象 , 而栈中存的是[基本数据类型]和[堆中对象的引用]。
2.对象是行为和属性的组合,其大小随着属性和行为的变化而动态变化。但是在栈中,每一个对象的引用都是只占用了4个字节的引用!
3.基本数据类型的大小是1-8个字节,大小固定并且不会再变化。适合在栈空间大小上限中存放!


五、JAVA中参数传递的问题具体是怎么样? | 参数传递时我是传值吗?

首先告诉大家的是,不论参数传递传递的是基本数据类型,还是堆中对象的引用。都是在传值,传值,传值!

解析:参数传递经常搞不清楚我传递到底是个数据,还是说这个标识符的引用。如图,我们的参数传递主要分为以上两类。基本数据类型会与堆中对象引用值。基本数据类型无疑是原始值,本身就代表了自己,去到那里都一样。但是对于传入对象这种情况,我们往往便容易分不清了。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

需要明白的是:

1.java没有指针,所以它都是进行传值调用,传基本数据类型的,和 传引用值的  引用值代表了目标对象的地址,当被传入后方法的使用是会根据引用值找到目标对象的
2.程序永远都是在栈中运行的,参数传递的时候,只存在 基本类型和 对象引用值 传递,不会直接传对象本身!但基本类型和对象引用值都是一个数据,只是这个数据被传递后程序在处理会根据规则去找到最终的想要的,这是程序自己的规则!
也就是说,当参数传递是对象引用的时候,我们传入的也是数值(一种称为引用值),他本质上是一串携带意义的数字! 当传入方法后,jvm可以根据底层规则找到这个对象的信息。


六、堆栈中对象有大小?|对象到底是多大呢?

解析如下:

1.java在内存对象分配的时候都是以8Byte为基础单位进行不断放大的,所以在设置大小的时候也默认以这个为尺度!
2.一个空白的Object对象是8个字节(Byte),加上一个引用值固定大小是4个字节,结合第一条分析一个初始化的完整对象在内存中分配的空间至少是12<16,即是不小于16个Byte。
3.所有的类对象都默认继承Object类,因此所有的对象都要默认大于8byte,堆中空白对象大小!
4.声明一个空白基本类型的包装类型大小至少要12个字节(一个Object类需要的空间)  ,而因为java对象的内存分配都是以8个字节为基础,所以一个包装类至少要16byte,因此在尽可能的情况下能不用包装类就不要用包装类,以确保空间够用!
 

猜你喜欢

转载自blog.csdn.net/qq_36505948/article/details/82790585