JVM内存结构的划分

1.堆

就相当于当你new一个对象的时候,就会分配一个堆内存给你,当对象销毁时就会有垃圾回收机制来回收这个对象的堆空间。

2.栈

就好比一串珠子,你只能从一头加或者取,要取后面的就要把前面的取出来才可以。

3.堆内存

  • 作用就是用来存放java中的对象和数组,当new一个对象或者new一个数组的时候就会在堆内存中开辟一个空间给它。用于存放。

  • 特点:第一个就是先进先出,后进后出,类似于一串珠子,一头来放,一头来出,先放进去的珠子可以先出来,后放进去的珠子要等前面的珠子出来以后才能进去。

  • 堆中的数据都具用默认的初始值。

  • 第二个 堆可以动态的分配内存大小,生存期事先不必告诉编译器,因为他是在运行的时候动态的分配内存,创建的对象当不再被指向时,将会被回收内存,内存回收需要通过jvm的自动垃圾回收器来管理,而C语言需要手动的清楚,这是java优于c的表现之一。

4.栈内存

  • 存在与java中的另一种内存,主要用来执行程序用的,比如基本类型的变量和对象的引用变量。

  • 它是由许多栈帧组成,而每个栈帧又包括了局部变量表、操作数栈、动态链接以及方法出口信息。每次方法调用都会将对应的栈帧压入虚拟机栈,当方法调用结束(方法调用return或者方法抛出异常)又会将该栈帧从虚拟机栈中弹出。由于栈的特性(FILO 先进后出,后进先出),每次操作的都是栈顶栈帧,又被称为“当前活动栈帧”,代表当前正在执行的方法。在JVM执行引擎运行时,所有指令都针对于当前活动栈帧进行操作。

  • 特点:”先进后出,后进先出

  • 栈的生存空间需要提前声明,而栈中数据的生存空间存在于{}大括号内,也就解释了为什么定义方法或者主函数的时候先要把方法体括起来。

  • 栈中的数据都没有初始值,需要手动的赋予

    JVM中堆和栈的主要区别:
    特性/内存区域 堆(Heap) 栈(Stack)
    存储内容 对象实例和数组 局部变量和方法调用记录
    内存管理 垃圾回收器自动管理 JVM自动管理,自动分配和回收
    生命周期 由垃圾回收器决定 与线程方法调用相对应,方法结束即释放
    访问速度 相对较慢 非常快
    内存大小 可配置,较大 相对较小,可配置
    线程私密性 所有线程共享 线程私有
    垃圾回收 是主要垃圾回收区域 通常不涉及垃圾回收
    内存泄漏问题 长时间持有对象引用可能导致内存泄漏 不太可能导致内存泄漏