首页 > 系统相关 >解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

时间:2023-06-12 10:32:29浏览次数:85  
标签:area 对象 stack 存放 heap 栈中 线程 共享 堆中

对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中

堆区:专门用来保存对象的实例(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.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

附:

堆和栈是程序运行的关键,应该将其理解清楚。

解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法_数据

栈是运行时的单位,而堆是存储时的单位。

堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处)。

为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?

第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。

第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。

第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。

第四,面向对象就是堆和栈的完美结合。其实,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。不得不承认,面向对象的设计,确实很美。

标签:area,对象,stack,存放,heap,栈中,线程,共享,堆中
From: https://blog.51cto.com/chengzheng183/6460240

相关文章

  • 运维工具SaltStack之一安装部署
    一、概述salt是一个异构平台基础设置管理工具,使用轻量级的通讯器ZMQ,用Python写成的批量管理工具,完全开源,遵守Apache2协议,与Puppet,Chef功能类似,有一个强大的远程执行命令引擎,也有一个强大的配置管理系统,通常叫做SaltStateSystem。 二、基本原理采用C/S模式,server端就是salt的mas......
  • 总结常用的几种 api 方式调用saltstack
    saltstack本身是用python写的,用python调用saltstack相对来说比较简单. 我这里采用的是第一种方法,但不同的是用tornado自封装了一层api 1.PythonclientAPIhttp://docs.saltstack.com/en/latest/ref/clients/#salt.wheel.WheelClient.cmd优点:最简单,只要机器安装了saltstack,......
  • STL之Stack与queue的模拟实现与duque的底层结构(3千字长文详解)
    STL之Stack与queue的模拟实现与duque的底层结构设计模式的概念设计模式像是古代的兵法,是以前的人总结出来的一些在特定的情况下,某种特定的好用的方法总结STL中迭代器也是一种设计模式——==迭代器模式==STL中stack和queue的实现就是使用了一种设计模式——==适配器模式!==适......
  • 微信小程序的onShareAppMessage怎么开发?
    onShareAppMessage是微信小程序中用于处理用户点击右上角分享按钮时触发的事件。开发者可以使用该事件来自定义分享内容和行为。具体使用方法如下:在小程序页面中,定义onShareAppMessage方法: Page({onShareAppMessage:function(options){return{title:......
  • JS stacktrace Vue 项目过大内存泄漏
    1.运行以下命令npminstall-gincrease-memory-limitincrease-memory-limit4096mb#改成适合本机的内存2.可能会提示  "node--max-old-space-size=10240"'不是内部或外部命令,也不是可运行的程序在node_modules文件夹下的.bin文件夹搜索"%_prog%"替换成%_prog%......
  • 8_How to install LEMP stack on Ubuntu VPS_
     地址:https://www.codewithharry.com/blogpost/lemp-stack-on-ubuntu-20/  HowtoinstallLEMPstack(Linux,Nginx,MySQL,PHP)onUbuntu20.04Inthistutorial,wewillinstalltheLEMPstackontheubuntu20basedserver.LEMPconsistsofLinux,Nginx(pr......
  • 3_Installing Linux, Apache, MySQL, PHP (LAMP) Stack on Ubuntu 20.04
      地址:https://www.codewithharry.com/blogpost/lamp-stack-ubuntu-20-04/ InstallingLAMPstackonUbuntu20.04in5MinutesThispostwillexplainhowtoinstallLAMPstackonUbuntu20.04.LAMPstackconsistsofthefollowingcomponents:Linux-AnyLi......
  • KingbaseESV8R6 heap table末端垃圾页回收机制
    前言默认情况下,vacuum表不能释放磁盘空间,只是在deadtuple做个标记位,但heaptable末端的垃圾页可以被truncate,从磁盘中释放空间。例如表的末尾的100个数据块里面全是垃圾,那么这100个数据块可以truncate阶段,文件也会变小。而位于其他位置的垃圾页,不能回收,因为会影响寻址(ctid)的变化......
  • python 列表 tips stackOverflow数据统计
    PYTHON笔记一Noteone**python中的集合类,有列表,元组,字典和集合四种。定义方式分别为:List=[]Turple=()Dict={key:value}Set={}作为JAVA程序员看来,python中的集合与JAVA中的集合类其实很相似,用着肯定是python更好用,个人认为优点如下:1.没有强定义类型。2.提供了很方便的......
  • .Net6添加Area域
      添加完成之后你的项目将会多出一个Area文件,同时vs会自动打开ScaffoldingReadMe.txt文件,把红框框内的内容复制到启动文件(ProGram.cs)中最后需要在你用到的视图或者控制器上加上Area标注 ......