【JAVA】栈和堆,JVM内存概述

JVM(虚拟机)内存的划分:

  • 概述

    • Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在本身的内存区域中进行更细致的划分,由于虚拟机中每一片内存处理的方式都不一样,因此要单独进行管理。
  • JVM内存的划分有五片:

    • 1.   寄存器;html

    • 2.   本地方法区;c++

    • 3.   方法区;程序员

    • 4.   栈内存;面试

    • 5.   堆内存。数组

  • 栈内存:

    • 栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,因此方法先进栈,而后再定义变量,变量有本身的做用域,一旦离开做用域,变量就会被释放。栈内存的更新速度很快,由于局部变量的生命周期都很短。
  • 堆内存:

    • 存储的是数组和对象(其实数组就是对象),凡是new创建的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,并且是封装多个(实体的多个属性),若是一个数据消失,这个实体也没有消失,还能够用,因此堆是不会随时释放的,可是栈不同,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,可是会被当成垃圾,Java有垃圾回收机制不定时的收取。
  • 图解

    • 代码:int [] arr=new int [3];缓存

    • 主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,可是右边不是一个具体值,是一个实体。实体建立在堆里,在堆里首先经过new关键字开辟一个空间,内存在存储数据的时候都是经过地址来体现的,地址是一块连续的二进制,而后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生以后每个空间都会进行默认的初始化(这是堆内存的特色,未初始化的数据是不能用的,但在堆里是能够用的,由于初始化过了,可是在栈里没有),不一样的类型初始化的值不同。因此堆和栈里就建立了变量和实体:
      jvm

    • 那么堆和栈是怎么联系起来的呢?函数

    • 咱们刚刚说过给堆分配了一个地址,把堆的地址赋给arr,arr就经过地址指向了数组。因此arr想操纵数组时,就经过地址,而不是直接把实体都赋给它。这种咱们再也不叫他基本数据类型,而叫引用数据类型。称为arr引用了堆内存当中的实体。(能够理解为c或c++的指针,Java成长自c++和c++很像,优化了c++)     
      优化

    • 若是当int [] arr=null;,arr不作任何指向,null的做用就是取消引用数据类型的指向。.net

    • 当一个实体,没有引用数据类型指向的时候,它在堆内存中不会被释放,而被当作一个垃圾,在不定时的时间内自动回收,由于Java有一个自动回收机制,(而c++没有,须要程序员手动回收,若是不回收就越堆越多,直到撑满内存溢出,因此Java在内存管理上优于c++)。自动回收机制(程序)自动监测堆里是否有垃圾,若是有,就会自动的作垃圾回收的动做,可是何时收不必定。

堆与栈的区别

  • 1.栈内存存储的是局部变量,基本类型的变量表示的是数据自己;而堆内存存储的是实体,每一个实体对象都有地址值和默认初始化值;

  • 2.栈内存的读取和更新速度要快于堆内存,由于局部变量的生命周期很短;

  • 3.栈内存使用一级缓存,存放的变量生命周期一旦结束就会被释放;而堆内存使用二级缓存,存放的实体会被垃圾回收机制不定时的回收。

参考连接

END

相关文章
相关标签/搜索