Java对象内存管理
对象内存管理介绍
-
编译好的java程序需要运行在JVM中;JVM为java程序提供并管理所需要的内存空间:“栈”、“堆”、“方法区”三个区域,分别用于存储不同的数据。
堆
-
存储new关键字所创建的对象。存储成员变量。
-
访问对象需要一个引用变量,当一个对象没有任何的引用时,即视为被废的对象,属于被回收的范围,该对象中所有的成员变量也随之被垃圾回收机制回收。
-
所以成员变量的生命周期:从对象在堆中创建开始到被垃圾回收机制回收结束。
-
当你创建一个对象的时候,对象放在堆中,栈中存放了一个地址,地址指向对象,
-
当创建基本数据类型时,直接在栈中存放。
栈
- 存储局部变量(在方法中声明的变量)
- 一个java程序从开始到结束会有多次方法的调用;JVM会为每一个方法的调用在栈中分配一个对应的内存空间--栈帧;一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据,当某个方法调用完成后,其对应的栈帧被清除,局部变量失效。
方法区
- 存放类的相关信息,java程序运行时,首先会通过类加载器载入类文件的字节码文件信息,经过解析后将其装入方法区中,类的各种信息(包括方法、类的静态成员变量)都在方法区存储。
- 类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中一份方法定义的。
- 每个对象所共享的东西。
常量池
常量池分为两种:静态常量池和运行时常量池。
静态常量池
- 静态常量池指的是在编译期确定,保存在class文件中的一些数据。
- 常量池主要用于存放两大类常量:字面量(Literal)和符号引用量。
- 字面量相当于Java语言层面常量的概念,如文本字符串、声明为final的常量值等。
- 符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:
1、类和接口的全限定名;
2、字段的名称和描述符;
3、方法的名称和描述符。
运行时常量池
- 在运行时常量池是方法区的一部分,在JDK1.7之后运行时常量池从方法区中移出,放在堆中。
- 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。
成员变量和局部变量的区别
- 普通成员变量是属于对象的,声明在类中,而局部变量是属于方法的。
- 成员变量有默认值(基本数据类型为...,引用数据类型默认值为null),局部变量没有默认值,在第一次使用时必须初始化。
- 生命周期不同。成员变量的生命周期:从对象在堆中创建开始到被垃圾回收机制回收结束;局部变量的生命周期:方法被调用开始到调用完成结束。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!