【Java】堆和栈

加班使我快乐!

点赞再看,养成习惯。

堆(Stack):

  1. 实际的对象被存储在堆内存中
  2. 创建的对象放在堆内存中,堆内存中的对象不会随着方法的结束而销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它
  3. 堆内存中的东西都有一个地址值。
  4. 堆内存中的数据都有默认值:
    • 整数       默认为0

    • 浮点数    默认为0.0

    • 字符       默认为 '\u0000'

    • 布尔       默认为false

    • 引用类型   默认为null         

        

栈(Heap):

  1. 对象的引用变量放在栈内存中
  2. 在所有方法中定义的局部变量放在栈内存中,随着方法的执行结束,这个方法的内存栈自然销毁
  3. 局部变量:方法的参数,或者是方法{}内部的变量
  4. 方法的运行一定要在栈当中运行

 

举个例子:

一个数组的内存图

方法区内保存的最主要的内容就是方法信息:方法名字、参数、返回值等等

将方法区main中的信息加载到栈内存,方法进栈。

变量array放在内存中。new出来的数组int[3]放在堆中,默认值为0,地址值假设为0x666,这个地址值会被赋值到左边变量中。实际上变量中存放的就是地址值,我们可以根据这个地址值在堆内存中找到数组在堆内存中的位置。

这里我改变了数组中的值,array[1]=10,根据array找到array数组在堆内存中的位置,找到array[1],重新赋值为10.

两个数组的内存图(同理)

两个引用指向同一个数组的内存图

拓展:

JVM内存的划分有五片:
  1. 寄存器(pc Register):与CPU相关
  2. 本地方法栈(Native Method Stack):与操作系统有关
  3. 方法区(Method Area):存储.class相关信息,包含方法的信息
  4. 栈内存
  5. 堆内存
为什么分为五片?一片不行吗?内存就好比我们住的房子,我们住的房子有卧室,有厨房,有厕所。如果房子里面不分这么多屋子也可以住,但是你想想,你在那边做着饭,这边有人在上厕所,这不就串味了了吗?所以说还是分开好,它不串味!
发布了150 篇原创文章 · 获赞 94 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章