当前位置: 首页 > 面试题库 >

线程有不同的堆吗?

濮阳原
2023-03-14
问题内容

据我所知,操作系统创建线程时,每个线程都会获得一个不同的堆栈。我想知道每个线程是否也有与自己不同的堆吗?


问题答案:

否。所有线程共享一个公共堆。

每个线程都有一个专用堆栈,它可以快速添加和删除其中的项目。这样可以使基于堆栈的内存速度更快,但是,如果您使用过多的堆栈内存(如无限递归中所发生的那样),则会导致堆栈溢出。

由于所有线程共享同一个堆,因此必须同步对分配器/释放器的访问。有许多避免分配器争用的方法和库。

某些语言允许您创建专用的内存池或单个堆,您可以将其分配给单个线程。



 类似资料:
  • 问题内容: 在此之前和此处已经提出了与该问题类似的观点,并且我知道Google coredump库(我已经评估并发现它缺乏,尽管如果我对问题有更好的了解,我可能会尝试解决该问题) )。 我想获得一个正在运行的Linux进程的核心转储,而不会中断该进程。自然的做法是说: 由于分叉的进程获得了原始进程内存的固定快照副本,因此我应该获得完整的核心转储,并且由于该副本使用写时复制,因此它通常应该很便宜。但

  • 我正在尝试熟悉c#的新Wait/async关键字,我发现了几个我不太了解的方面。 > 让我们从比赛条件开始: 这是否会一直按预期工作(例如写入文件12345......而不是13254之类的)? 第二件事是,如果异步函数不包含await运算符,它将同步执行。而且,根据microsoft文档,异步函数总是在调用线程中执行(与BeginInvoke相比)。接下来我要问3个问题: 异步函数在释放到调用方

  • #include <stdio.h> #include <pthread.h> #include <unistd.h> int a = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(10); } } int m

  • 问题内容: 我通过一个会话连接到数据库。在整个程序中,我总是有相同的会话。我的线程“ 1”从数据库中捕获主要数据。必须允许用户取消该线程。因此,如果用户频繁或快速按下“取消”按钮(这是我的解释),则会发生以下错误: 如果我取消线程“ 1”完成并尝试从数据库加载另一个主数据集后在后台运行的线程“ 2”,则会发生相同的错误。 我在两个线程中使用同一会话的失败是吗? 解决此类问题的正确方法是什么? 问题

  • 我知道如何使用-Xss为java线程设置堆栈大小,我们在产品中使用它。 但是当我们的应用程序中使用了很多线程,并且设置了-Xss(我们设置为512k我们的使用)。我们会遇到错误报告无法创建新的本机线程。它应该与堆栈大小有关,因为当我们设置-Xss256k时,错误消失了。 我的问题是对于1个线程,Xss设置堆栈大小,但是对于所有线程,堆栈大小如何<整个线程的总堆栈内存大小的限制是什么?我没有发现这样

  • 在使用CPU的高负载应用程序上进行线程转储,我看到很多线程处于这种状态: “ajp executor threads-XXXXXX”prio=10 tid=0x00002b04b8b33801 nid=0x5327可运行[0x0000000000000000]java。lang.Thread。状态:可运行 对我来说,真正奇怪的是根本没有堆栈跟踪,ajp线程的总数高于配置的最大线程数(见下文) 当应