侧边栏壁纸
博主头像
清如许博主等级

努力成长为一颗大树,一半洒落阴凉,一半沐浴阳光,非常沉默非常骄傲,从不依靠从不寻找

  • 累计撰写 58 篇文章
  • 累计创建 36 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

java存储机制(堆、栈、方法区).md

清如许
2022-06-10 / 0 评论 / 0 点赞 / 16 阅读 / 689 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-06-10,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

堆、栈、方法区存储的内容

堆:
堆中存放的都是new出来的对象,每个对象都包含一个与之对应的.class文件,凡是new出来的对象都存放在堆中,堆中不存放基本类型和对象引用,只存放对象本身。

非静态成员变量在类的实例化时开辟空间并初始化,所以 类的非静态成员变量也放在堆中。

对于堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理。

栈:
每个线程包含一个栈区,栈中只保存 基础数据类型的值和对象的引用
。在方法执行时,被分配的内存就存在栈中,所以当然存储的局部变量就在栈中。当一段代码或者一个方法调用完毕后,栈中为这段代码所提供的基本数据类型或者对象的引用立即被释放;

每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。

栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区:
方法区又叫静态区,方法区中包含的都是在整个程序中永远唯一的元素比如class,static变量

方法区和堆一样都是被各个线程所共享,它用于存储class二进制文件,包含了虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

常量池是方法区的一部分内存,常量池在编译期间就将一部分数据存放于该区域,包含基本数据类型如int、long等以final声明的常量值,
串池也是方法区中的一部分内存,用于存放String字符串,对于方法运行期位于栈中的局部变量String常量的值可以通过
String.intern()方法将该值置入到常量池中。

方法区是线程安全的,由于 所有的线程都共享方法区
,所以,方法区里的数据访问必须被设计成线程安全的。方法区的静态变量一个线程访问的时候另一个线程必须等待。

下面一个图展示上面内容:
![java存储机制图示](https://img-blog.csdnimg.cn/20190509102725256.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hY1d4,size_16,color_FFFFFF,t_70)

0

评论区