从底层内存分配的角度去看程序运行

从底层内存分配的角度去看程序运行?

这就是我所强调的,程序运行终究是0010101010101101101运行在机器上,我们要研究真正的实体所在,程序在运行的时候,我们应该去脑补一下内存的样子,关于内存真真正正的样子,请看类/对象与内存控制和数组与内存控制和变量与内存控制https://blog.csdn.net/strivenoend/article/details/83268135

https://blog.csdn.net/strivenoend/article/details/83215232

https://blog.csdn.net/strivenoend/article/details/83213107

最后我们总结一下关于从底层内存分配的角度去看程序运行:

程序运行实质上是内存给程序分配一定存储空间,程序才得以在内存中运行。

操作系统会给程序的数据分配内存,而程序是靠变量去操控内存中的数据的,变量分为基本类型变量和引用类型变量(数组+对象),因此我们应该研究变量与内存分配的关系。

分配内存,,,,,,,,初始化的过程就是分配内存并且向内存写入数据的过程

基本类型变量内存分配固定大小的字节,引用类型变量内存分配不固定(地址值大小)的字节,对象/数组对象依照其需要分配

局部变量分配栈内存,数组元素和成员变量(实例变量+类变量)分配堆内存

程序运行时,对于第一次加载的类,会将类加载到内存中,并且为这个类的类变量以及父类的类变量分配内存,并且为其隐式/显示调用静态初始化块/系统默认赋值写入数据,追溯到祖先类java.lang.Object

对于创建对象,会为创建的对象分配内存,并且为这个对象的实例变量及父类的实例变量分配内存,并且为其隐式/显示调用初始化块/构造器/系统默认赋值写入数据,追溯到祖先类java.lang.Object【引用型变量存储在方法栈内存中,其值为对象所在地址值】

对于局部变量系统会在调用方法时为其分配内存,并且程序需要给他显示赋值。【基本类型变量,其值为其本身数据的值】

对于数组对象,系统会为其分配一块连续的堆内存,可以由程序给他显示数值(数组对象的静态初始化),也可以由系统给他隐式赋值(数组对象的动态初始化)【引用型局部变量存储在方法栈内存中,其值为数组对象所在地址值】,

类变量/实例变量的初始化时机

无论是实例变量还是类变量其初始化顺序遵循如下规则

类变量初始化:先静态初始化块/定义类变量时赋初值(二者执行顺序=代码中顺序),

实例变量初始化:先初始化块/定义十六变量时赋初值,后构造器,编译器最终将这些对实例变量的赋值语句整合到构造器中,且在构造器语句之前执行

垃圾回收机制不仅回收无引用的对象,还回收无引用的数组对象

数组变量和类变量都是引用型变量,二者的值为数组对象的地址值,java普通对象的地址值

程序通过基本类型的变量和引用类型的变量去访问内存

所有局部变量都是放在占内存中保存的,不管是基本类型的变量,还是引用类型的变量,都是存储在各自的方法栈区内,但引用型变量所引用的对象(数组对象,java普通对象)都是存储在堆内存中

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

NullPointerException空指针异常:表明一个引用类型的变量没有指向有效的对象,因此叫空指针异常

从内存的角度看,是没有多维数组的,(⊙﹏⊙),只不过是你指向我,我指向你,最终指向xxx罢了

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

要考虑每一行代码对空间的要求,占用了多少内存,java的空间复杂度计算=对象占用的堆内存,考虑对象占用的内存和垃圾回收无用内存所带来的系统开销

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

类变量属于类,实例变量数据实例,通过实例去访问类变量的实质是通过class对象去访问类变量,因为实例对象内存区并没有类变量,类变量存储在class对象的内存区

类第一次加载时系统会为其创建对应的class对象,并且为这个class对象的类变量进行初始化,static只能用来修饰类里的成员

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

当创建任何java对象时,程序总是会先依次调用父类的非静态初始化块&&如果在父类显示定义初值的话,父类的构造器,最后才调用到本类的非静态初始化块,&&在显示定义初值,构造器执行(隐式调用)
子类如果想调用父类的指定的构造器的话,可以显示调用super()
子类如果想调用子类的指定的构造器的话,可以显示调用this()
子类如果构造器中既没有super()也无this()系统则会在执行子类构造器之前,隐式调用父类无参数的构造器super()
实际就是子类构造器的第一行不是显示super()就是隐式super()要不就是显示的this()
this是指向当前对象的引用变量
吊用被子类重写的方法super.xxx()
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值