JVM内存结构的划分
1.堆
就相当于当你new一个对象的时候,就会分配一个堆内存给你,当对象销毁时就会有垃圾回收机制来回收这个对象的堆空间。
2.栈
就好比一串珠子,你只能从一头加或者取,要取后面的就要把前面的取出来才可以。
3.堆内存
-
作用就是用来存放java中的对象和数组,当new一个对象或者new一个数组的时候就会在堆内存中开辟一个空间给它。用于存放。
-
特点:第一个就是先进先出,后进后出,类似于一串珠子,一头来放,一头来出,先放进去的珠子可以先出来,后放进去的珠子要等前面的珠子出来以后才能进去。
-
堆中的数据都具用默认的初始值。
-
第二个 堆可以动态的分配内存大小,生存期事先不必告诉编译器,因为他是在运行的时候动态的分配内存,创建的对象当不再被指向时,将会被回收内存,内存回收需要通过jvm的自动垃圾回收器来管理,而C语言需要手动的清楚,这是java优于c的表现之一。
4.栈内存
-
存在与java中的另一种内存,主要用来执行程序用的,比如基本类型的变量和对象的引用变量。
-
它是由许多栈帧组成,而每个栈帧又包括了局部变量表、操作数栈、动态链接以及方法出口信息。每次方法调用都会将对应的栈帧压入虚拟机栈,当方法调用结束(方法调用return或者方法抛出异常)又会将该栈帧从虚拟机栈中弹出。由于栈的特性(FILO 先进后出,后进先出),每次操作的都是栈顶栈帧,又被称为“当前活动栈帧”,代表当前正在执行的方法。在JVM执行引擎运行时,所有指令都针对于当前活动栈帧进行操作。
-
特点:”先进后出,后进先出
-
栈的生存空间需要提前声明,而栈中数据的生存空间存在于{}大括号内,也就解释了为什么定义方法或者主函数的时候先要把方法体括起来。
-
栈中的数据都没有初始值,需要手动的赋予
JVM中堆和栈的主要区别:
特性/内存区域 堆(Heap) 栈(Stack) 存储内容 对象实例和数组 局部变量和方法调用记录 内存管理 垃圾回收器自动管理 JVM自动管理,自动分配和回收 生命周期 由垃圾回收器决定 与线程方法调用相对应,方法结束即释放 访问速度 相对较慢 非常快 内存大小 可配置,较大 相对较小,可配置 线程私密性 所有线程共享 线程私有 垃圾回收 是主要垃圾回收区域 通常不涉及垃圾回收 内存泄漏问题 长时间持有对象引用可能导致内存泄漏 不太可能导致内存泄漏
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!