有谁知道是否有办法动态(运行时)增加主线程的堆栈大小?另外,我相信这是同一个问题,是否可以Thread在实例化后增加/更新 a 的堆栈大小?
Thread的 CTOR 允许定义其堆栈大小,但我找不到任何更新它的方法。实际上,我在JDK中没有发现任何对堆栈大小的管理(这往往表明这是不可能的),一切都在VM中完成。
根据java 语言规范,可以在“创建堆栈时”设置堆栈大小,但有一个注意事项:
Java 虚拟机实现可以为程序员或用户提供对 Java 虚拟机堆栈初始大小的控制,以及在动态扩展或收缩 Java 虚拟机堆栈的情况下,对最大和最小大小的控制。
IMO 不是很清楚,这是否意味着某些 VM 处理最大(编辑)堆栈大小在给定范围内演变的线程?我们可以用 Hostpot 做到这一点吗(我在 Xss 旁边没有找到任何与堆栈大小相关的选项)?
谢谢 !
是否可以增加 ASP.NET core 2 二进制文件的堆栈大小?我必须使用 32 位 COM 互操作组件,它碰巧在某些定义的条件下粉碎堆栈。这不是无限递归,只是在请求最大可能的数据集时碰巧触及限制的工作负载,因此增加堆栈可能是一个可接受的解决方案。
通过 EDITBIN 修改堆栈大小仅在直接应用于 dotnet.exe 时才有效,这显然不是首选解决方案。
如何确定嵌入式系统上正在运行的C程序的当前堆栈和堆大小?另外,我怎样才能发现嵌入式系统允许的最大堆栈和堆大小?我想到线性调用malloc()的大小越来越大,直到它找不到堆大小,但是我对堆栈的大小更感兴趣.
我使用的是mbed NXP LPC1768,我使用的是在GitHub上开发的名为gcc4mbed的离线编译器.
有更好的想法吗?非常感谢所有帮助!
据我所知,堆栈内存在虚拟内存地址中是连续的,但是堆栈内存在物理上也是连续的?这与堆栈大小限制有关吗?
编辑:
我曾经认为堆栈内存不必在物理上是连续的,但是为什么我们认为堆栈内存总是比堆内存快?如果它在物理上不是连续的,那么堆栈如何利用缓存的更多优势?还有另一件事总是让我感到困惑,cpu在数据段中执行指令,该指令不在虚拟内存中的堆栈段附近,我认为操作系统不会使堆栈段和数据段在物理上彼此靠近,因此这可能会损害缓存效果,您认为呢?
再次编辑:
也许我应该举一个例子来更好地表达自己,如果我们想对大量数字进行排序,使用数组存储数字要比使用列表更好,因为每个列表节点都可以由构造malloc,因此没有充分利用缓存,这就是为什么我说堆栈内存比堆内存快。
在我的库(JavaScript 中的方案)中,我有一个测试应该失败,因为它计算 (! 1000),并且在实现 TCO(尾调用优化)时应该通过。但最近 NodeJS 可能增加了堆栈大小限制,因为测试通过意味着它没有失败。
有没有办法让 NodeJS 中的堆栈大小更小?所以我不需要增加阶乘函数的值来溢出堆栈。
编辑:请注意,GitHub--stack-size上讨论的选项可能会使节点崩溃。我希望出现堆栈溢出错误,但值小于 1000。
我的目标是提出可以并行运行的最大线程数。谷歌向我指出了许多链接,他们通过划分 RAM/StackSize 给出了简单的数学计算。在 64 位 Linux 中,我们将线程堆栈大小定义为 10 MB(ulimit -s = 10240kb),RAM 为 4GB,为 OS 留出 1 GB,按照这个数学计算我可以有大约 300 个线程,但是我的小型测试应用程序写到 ~32297 然后给出内存不足错误。
我用 -Xss 尝试了不同的值,但这些值对线程数几乎没有任何影响,它仍然与 ~32297 相同)。
这给我的印象是堆栈大小是可变的,由操作系统决定,并在需要时达到我们定义的最大值,但无论我在哪里阅读,它们的大小堆栈大小都是静态的
我到底错过了什么?
我最近一直在寻找具有2000个递归函数调用的深度堆栈,并且想知道如何在Java中的堆栈中的函数调用数量上定义限制?
当我尝试使用以下命令在macOS Sierra上扩展堆栈大小时ulimit -s unlimited,终端将显示下一条消息:
-bash:ulimit:堆栈大小:无法修改限制:不允许操作。
我也尝试使用,sudo ulimit -s unlimited但也不会离开我。有人知道吗?
我像下面一样运行我的程序,并使用 ( ulimit -s unlimited)。有用。
REAL(DP), DIMENSION(1024,2,1541) :: L_X TanV
REAL(DP), DIMENSION(4) :: Val_X, Val_Y
REAL(DP), dimension(1029) :: E_x
REAL(DP), dimension(1024) :: E_y
REAL(DP), DIMENSION(1024,1024) :: E_Fx, E_Fy
!$OMP SECTIONS PRIVATE(i, j, ii,jj, PSL_X, i_x, i_y, Val_X, Val_Y)
!$OMP SECTION
do j=1,LinkPlusBndry
do i=1,Kmax(j)-1
PSL_X(1)=modulo(L_X(i,1,j),H*N2); PSL_X(2)=L_X(i,2,j)
i_x=floor(PSL_X(1)/H)+2; i_y=floor(PSL_X(2)/H)
call Delta4((E_x(i_x:i_x+3)-PSL_X(1))/H,Val_X)
call Delta4((E_y(i_y:i_y+3)-PSL_X(2))/H,Val_Y)
do ii=1,4; do jj=1,4
EE_Fx(i_y+ii-1,i_x+jj-1)=EE_Fx(i_y+ii-1,i_x+jj-1) &
+tauH2*TanV(i,1,j)*Val_X(jj)*Val_Y(ii)
end do; end do
end do
end do
...
...
...
!$OMP SECTION
do j=1,LinkPlusBndry
do i=1,Kmax(j)-1
PSL_X(1)=modulo(L_X(i,1,j),H*N2); PSL_X(2)=L_X(i,2,j)
i_x=floor(PSL_X(1)/H)+2; …Run Code Online (Sandbox Code Playgroud) 一个Web爬虫脚本,最多可生成500个线程,每个线程基本上都会请求从远程服务器提供的某些数据,每个服务器的回复在内容和大小上与其他服务器不同.
我正在为线程设置stack_size为756K
threading.stack_size(756*1024)
Run Code Online (Sandbox Code Playgroud)
这使我能够拥有足够数量的线程并完成大部分工作和请求.但是由于某些服务器的响应比其他服务器更大,并且当线程得到那种响应时,脚本会死于SIGSEGV.
stack_sizes超过756K使得无法同时拥有所需数量的线程.
关于如何在没有崩溃的情况下继续使用给定的stack_size的任何建议?以及如何获得任何给定线程的当前使用的stack_size?