当前位置:网站首页>解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
2022-07-21 17:03:00 【小小梁的实验室】
原文链接:解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。_wu594914197的博客-CSDN博客
解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法_gaoyong_stone的博客-CSDN博客_栈堆静态区的用法
对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中
堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中)
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.
3.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
栈区:对象实例在Heap 中分配好以后,需要在Stack中保存一个4字节的Heap内存地址,用来定位该对象实例在Heap 中的位置,便于找到该对象实例。
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
4.由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.
静态区/方法区:
1.方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
附:
堆和栈是程序运行的关键,应该将其理解清楚。
栈是运行时的单位,而堆是存储时的单位。
堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处)。
为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。
第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。
第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。
第四,面向对象就是堆和栈的完美结合。其实,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。不得不承认,面向对象的设计,确实很美。
边栏推荐
- 七/四/五层网络模型
- excel 如何根据身份证号自动匹配性别代码
- Verilog -- Serial four bit adder and leading four bit adder 74hc283
- 用odoo集成EFK,實現日志可視化
- Enterprise unified social credit code rules
- 原码一位乘法器
- 自学golang【第三章:第一个go语言程序】使用goland创建第一个go程序,main函数与init函数,使用go实现运行windows命令,实现cmd的数据输出
- 不用编程也能做应用开发?能!
- Detailed explanation of UNET (with graphics and code implementation)
- 云安全日报220721:思科混合云运维管理解决方案发现执行任意命令漏洞,需要尽快升级
猜你喜欢
自学golang【3.3go语言的循环语句】for循环语法结构,省略初始条件,省略递增条件,省略结束条件的应用
Error: L6218E: Undefined symbol SX1276FskGetPacketCrcOn (referred from sx1276-fsk.o)
生产环境TiDB集群缩容TiKV操作步骤
Finer grained useeffect
七/四/五层网络模型
力扣每日一题(1)
mysql的binlog
September memo
地址总线、数据总线、控制总线详细解释
Multiple worksheets under the same workbook have the same format
随机推荐
SPI debugging is not successful, it is likely that you connected the wrong cable!!
STM32 SPI 读取数据不准确,只有第一次对,后边均不对
百面机器学习总结
MySQL transaction
excel 如何删除有颜色的行
STM32 Hal library SPI always reads FF. Solve the problem!
P[0] as the judgment condition of the for loop
excel中怎么批量在文字前后增加文字
Percona xtradb cluster installation
Spark read CSV file operation, explanation of option parameter
char short int等类型变量在内存中占用字节数
深度学习之Tensorflow框架实现VGG/RNN网络/验证码生成与识别/文本分类
8位补码booth一位乘法器
Why not overwrite when pasting in excel
Personal summary of the difference between on and where in MySQL -- make clear where the conditions should be written
The difference between RDB and AOF in the persistence mode of redis
Detailed explanation of UNET (with graphics and code implementation)
深度学习之Caffe框架及制作数据源
Next. JS and Remix
阿里云技术专家郝晨栋:云上可观测能力——问题的发现与定位实践