Java 内存布局

值拷贝与引用拷贝

数组是引用类型
1.基本数据类型,直接在栈中分配值
2.引用类型,先在堆中开辟了一个数据空间(对数据的操作都在堆中进行),然后把该数据空间地址给栈中对应的变量名
3.值拷贝:基本数据类型是直接将值进行拷贝,不会对源数据造成影响
4.引用拷贝:引用类型拷贝,拷贝的是数据空间地址,也就是两个变量操作的是同一个数据空间,自然其中一个变量操作改变数据,会对另一个变量造成影响
在这里插入图片描述

二维数组的内存布局

1.在堆中创建一个长度为行个数大小的一维数组(假设为A数组)
2.A数组中每个元素再指向一个长度为列个数大小的一维数组(假设为B数组)
3.每个B数组中的元素才是存放数据的地方
4.将A数组的地址返回给栈
在这里插入图片描述

创建对象的内存布局

1.先在方法区中加载Cat类信息(属性信息,方法信息)
2.在堆中创建一个Cat并分配地址
3.基本数据类型直接在堆中赋值
4.在方法区中的常量池中创建字符串,并将地址传给堆中对应的属性
在这里插入图片描述

方法执行流程

1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2.当方法执行完毕,或者执行到return语句时,就会返回,
3.返回到调用方法的地方
4.返回后,继续执行方法后面的代码
5.当main方法(栈)执行完毕,整个程序退出
在这里插入图片描述

静态变量/静态方法/静态代码块/内存分析

在JDK1.8之前 类变量是存放在方法区中的静态域中

在JDK1.8以及JDK1.8之后
在类加载时,会在堆中创建对应类的class对象,而静态变量/静态方法就存放在这个class对象中,因此所有该类的对象都可以共享静态变量/静态方法

在加载类对象时,同时执行静态代码块,也就是类代码块只执行一次的原因,因为class对象只会加载一次,后面再次创建该类的对象时,直接使用堆中class对象创建即可,class对象相当于一个模板
在这里插入图片描述

反射原理图

1.将写好的代码通过Javac 编译 生成字节码文件,字节码文件包含的有类的属性信息,构造器信息,方法信息…

2.当第一次new一个对象时,就会触发类加载,字节码文件会通过类加载器Class.Loader,在堆中生成一个该类的类对象,这个类对象是一种数据结构,它包含类的所有成员变量、构造器、成员方法,这些都已经可以操作的对象。并且类对象是一种模板(类对象只会创建一次,在类加载时创建)。

该类的所有对象都是由类对象创建,创建该类的对象都是存放在堆中,该对象同时知道是那个类对象创建的自己(这就是为什么对象.class可以获得类对象)

只有加载类对象后,才能创建该类的对象

3.得到类对象后,自然可以创建对象,调用方法,操作属性等
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值