Java 线程,进程;堆,栈学习的疑问

.class从编译到执行的过程。程序执行由外存进入内存后,就由作业变成了变成进程进程仅仅是一个概念,用PCB标识,就是一个程序的执行过程。JVM会为每个进程分配空间。空间包括两部分:栈(又称为堆栈)和堆。
栈(先进先出)中的内容:方法、基本数据类型等,注意,定义String s ="123"这种定义方式,是在栈里执行的。
而堆:堆的内容是共享的,是程序运行是通过new()开辟的。String str1 =new String (“abc”);是在堆空间中开辟的,所以才有线程安全这一说法吗?(线程同步的访问堆中的数据,这里,同步就是有次序的访问的意思,是由于操作系统的并发性所导致的有可能多个线程访问资源会导致异步性((结果是不可预知的))的操作)所以要保证线程的安全)(一个class(进程)中,可以启动一个新的线程)。

栈:就是STACK。实际上是只有一个出入口的队列,即后进先出(First In Last Out),先分配的内存必定后释放。一般由,由系统自动分配,存放存放函数的参数值,局部变量等,自动清除。

还有,堆是全局的(线程安全?),栈是每个函数进入的时候分配栈空间中一小块,函数返回的时候就释放了,静态和全局变量,new 得到的变量,都放在堆中,局部变量放在堆栈中,所以函数返回,局部变量就全没了。

其实在实际应用中,栈多用来存储方法的调用。而堆则用于对象的存储。
堆:堆是heap,是所谓的动态内存,其中的内存在不需要时可以回收,以分配给新的内存请求,其内存中的数据是无序的,即先分配的和随后分配的内存并没有什么必然的位置关系,释放时也可以没有先后顺序。一般由使用者自由分配,C中的malloc语句所产生的内存空间就在堆中,需要手动释放。

int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处 理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。

这里,也体现了数据结构的作用,什么栈,堆,都是只是内存上的空间罢了,只不过呢,因为栈这个数据结构的特性,至少满足了方法调用时候的时候(包括递归操作)的可实现性,也很方便。后进先出的操作。牛皮。而堆呢,是因为查找性能贼好吗?才用这种数据结构存储堆对象啥的。

写到这里感觉脑子这有点糊涂了,挂几个网址,方便回头在看。包括上文中的一些内容,这是摘抄与这几个网址。
https://www.cnblogs.com/CNty/p/10913844.html
https://blog.csdn.net/YuanMxy/article/details/74170775
https://blog.csdn.net/jianghao233/article/details/82777789
https://blog.51cto.com/13479739/2308603
https://www.cnblogs.com/iliuyuet/p/5603618.html
(上面这个很重要)

在这里插入图片描述
上面这个图片的话,并不是JVM而是,广义上的操作系统。
进程(在内存中)主要由三部分组成:PCB,数据段,程序段。是不是JAVA栈和堆的概念有点相似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值