JVM内存结构的划分
1.堆
就相当于当你new一个对象的时候,就会分配一个堆内存给你,当对象销毁时就会有垃圾回收机制来回收这个对象的堆空间。
2.栈
就好比一串珠子,你只能从一头加或者取,要取后面的就要把前面的取出来才可以。
3.堆内存
-
作用就是用来存放java中的对象和数组,当new一个对象或者new一个数组的时候就会在堆内存中开辟一个空间给它。用于存放。
-
特点:第一个就是先进先出,后进后出,类似于一串珠子,一头来放,一头来出,先放进去的珠子可以先出来,后放进去的珠子要等前面的珠子出来以后才能进去。
-
堆中的数据都具用默认的初始值。
-
第二个 堆可以动态的分配内存大小,生存期事先不必告诉编译器,因为他是在运行的时候动态的分配内存,创建的对象当不再被指向时,将会被回收内存,内存回收需要通过jvm的自动垃圾回收器来管理,而C语言需要手动的清楚,这是java优于c的表现之一。
4.栈内存
-
存在与java中的另一种内存,主要用来执行程序用的,比如基本类型的变量和对象的引用变量。
-
它是由许多栈帧组成,而每个栈帧又包括了局部变量表、操作数栈、动态链接以及方法出口信息。每次方法调用都会将对应的栈帧压入虚拟机栈,当方法调用结束(方法调用return或者方法抛出异常)又会将该栈帧从虚拟机栈中弹出。由于栈的特性(FILO 先进后出,后进先出),每次操作的都是栈顶栈帧,又被称为“当前活动栈帧”,代表当前正在执行的方法。在JVM执行引擎运行时,所有指令都针对于当前活动栈帧进行操作。
-
特点:”先进后出,后进先出
-
栈的生存空间需要提前声明,而栈中数据的生存空间存在于{}大括号内,也就解释了为什么定义方法或者主函数的时候先要把方法体括起来。
-
栈中的数据都没有初始值,需要手动的赋予
JVM中堆和栈的主要区别:
特性/内存区域 堆(Heap) 栈(Stack) 存储内容 对象实例和数组 局部变量和方法调用记录 内存管理 垃圾回收器自动管理 JVM自动管理,自动分配和回收 生命周期 由垃圾回收器决定 与线程方法调用相对应,方法结束即释放 访问速度 相对较慢 非常快 内存大小 可配置,较大 相对较小,可配置 线程私密性 所有线程共享 线程私有 垃圾回收 是主要垃圾回收区域 通常不涉及垃圾回收 内存泄漏问题 长时间持有对象引用可能导致内存泄漏 不太可能导致内存泄漏