1. 面向对象的内存管理

1.1 Java中的内存管理

栈内存:

每个线程都有自己独立的栈,目前只要考虑一个即可,方法被调用进栈执行,执行完毕出栈

简单理解:栈跟方法有关

堆内存:

所有线程共享,存储对象、数组、字符串常量池

简单理解:堆跟new关键字有关,只要通过new关键字开辟的小空间都是开在堆内存中的

方法区:

JDK7永久代实现,JDK8+元空间实现,从虚拟机内部移到本地内存。存储字节码信息、常量、静态变量

简单理解:方法区是存储class字节码文件的, 当运行一个类的时候,会把这个类的字节码文件加载到内存中临时存储

本地方法栈:

调用本地Native方法

程序计数器:

每个线程独立、记录当前线程执行的字节码指令地址(行号)


1.2 Java中对象的内存分配

在这里插入图片描述

  • stu记录的是内存地址
  1. Student stu= new Student();创建对象的七步:
    1. 加载class字节码文件
    2. 申明等号左边的局部变量:
    3. 在堆里面开辟一个空间(对象)
    4. 给对象中的属性进行默认初始化
    5. 给对象中的属性进行显示初始化
    6. 给对象中的属性利用构造方法进行初识化
    7. 把对象的内存地址赋值给等号左边的变量
  2. 方法出栈之后,方法里面的变量全部消失
  3. 如果没有任何地方使用堆里面的对象,那么对象也会从堆里面消失
  4. 方法区里面字节码信息一般不会消失,除非关闭虚拟机

1.3 Java中对象在内存中的传递

  • 类似c/cpp中的指针思想

在这里插入图片描述

  • 将一个对象传递给一个方法, 实际传递的是对象的内存地址
  • 当多个变量指向同一个对象时, 只要由一个变量修改了对象中的属性, 其他变量再次访问就是修改之后的结果了

2. this关键字的真正原理

  • this本质: 代表所在方法调用者的地址值

在这里插入图片描述


Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐