堆,栈,字符串池,以及进程,线程浅谈内存(个人理解)

进程:一个服务的运行至少一个进程的开启。进程就是程序的一次运行,功能的一次跑动。说简单点好比点击跳转,就是开启一个进程。

线程:线程是进程的实体,简单点说,线程就是分配空间(堆,栈),整合内存空间,处理数据交换。

一个进程可以拥有多个线程,多个线程之间可同时,协同运行。

堆:内存空间对对象分配的空间通称,分全局堆和局部堆。全局堆就是未分配使用的空间,局部堆就是线程中分配的空间,当该线程所属的进程结束或关闭,内存会释放。

栈:开启进程后,内存分配给线程内所定义的变量的空间统称。

以java语言 main主函数为例,浅谈标题;

 main方法加载进栈;

进程开启,main方法最先入栈,main栈内分配空间存储main方法内定义的所有变量,而对象数据会存储在堆中,字符串数据会存储在字符串池中,执行完毕,main出栈,内存释放。

简单说下字符串池以及堆中数据的创建和映射;

数据存储在内存中都会自带一个内存位置,格式例为0x0034这种格式,数据跟变量的绑定都可以理解为是变量跟内存位置的映射。当定义一个变量类型为字符串时,操作系统首先要在字符串池中查找创建的数据是否以及存在字符串池中了,如果已经存在,只需要将该数据所对应的空间位置(0x0034)与该变量绑定而不需要在字符串池中创建该数据,反之,字符串池中创建数据,空间位置绑定变量。所以说变量名可以有很多不一样,但字符串池中的数据都是唯一的。而堆跟字符串池不同,没new一个对象都是全新的不同数据,即使对象数据相同;

猜你喜欢

转载自www.cnblogs.com/shouyerenyinuo/p/10209388.html