`
vyloy
  • 浏览: 80365 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

linux的线程栈大小的限制导致的段错误

    博客分类:
  • C++
阅读更多
#include <string.h>
#include <stdio.h>
 
int main()
{
    int a [10 * 1024 * 1024];
    a[0] = 1;
    return 0;
}

上面的代码运行就会crash。
原因:
ulimit -s

10240
可以看到linux配置的线程栈的大小为10M。
函数里面使用了两个大的数组,超出了linux线程栈大小配置的上限,而函数调用是需要栈的,当空间不足,导致越界,所以core掉。所以在函数中劲量少使用大的数据,而是使用堆分配内存。

为什么加上a[0] = 1;才会core,不加是不会core呢

因为在linux中,只有在使用时候才会分配内存,如果没有a[0]=1;并不会在栈上为a数组分配内存,所以不会导致core掉。
可以使用pmap工具来查看地址空间的分配状况。
附:使用inline时,最后不要在inline函数中申请大的数组,不然很容易出问题。

作者:翁志艺
分享到:
评论

相关推荐

    线程堆栈大小的使用介绍示例代码

    如果一个线程的递归深度过深或者创建了大量的局部变量,可能会超过这个限制,导致`Stack Overflow`错误。 线程堆栈大小的调整可以在创建线程时通过pthread库的`pthread_attr_setstacksize()`函数来设定,或者在程序...

    详谈Linux开发中常见段错误问题的原因及分析

    考虑使用堆分配或检查不同平台的栈大小限制。在创建线程时,若不确定所需栈空间,使用系统默认值。 6. **操作系统限制**:每个进程都有资源限制,如最大内存分配、文件描述符数量等。使用ulimit、setrlimit和sysctl...

    Linux下C多线程编程[汇编].pdf

    8. **线程属性**:虽然在示例中未使用,但可以通过`pthread_attr_t`结构体来设置线程属性,如栈大小、调度策略、分离状态等。`pthread_attr_init()`和`pthread_attr_set*()`函数可用于初始化和设置属性。 9. **线程...

    问题分析:java.lang.OutOfMemoryError unable to create new native thre

    4. **线程栈大小**: - 每个Java线程都有一个独立的栈空间,用于存储方法调用信息。如果线程栈过大,可能会快速消耗掉可用的非堆内存。可以通过JVM参数`-Xss`来调整每个线程的栈大小。 5. **系统资源监控**: - ...

    线程池实例(Linux)

    4. **Linux线程实现**:在Linux中,线程由POSIX标准定义,使用`pthread_create()`函数创建线程,`pthread_join()`等待线程结束,`pthread_mutex_t`用于互斥锁,`pthread_cond_t`用于条件变量,`pthread_rwlock_t`...

    【LINUX】关于动态内存分配的理解

    - 当有多个指针指向同一块动态分配的内存空间时,只能通过一个指针调用free函数释放内存,重复释放会导致运行时错误。 - 动态内存的指针可以作为函数参数传递,实现跨函数使用。 - realloc函数用于重新分配内存空间...

    Linux_Multi_Thread总结1

    通过`pthread_attr_init`和`pthread_attr_set`等函数,可以设置线程的属性,如栈大小、调度策略、调度参数等。 9. **线程安全的编程实践**: 使用互斥锁、条件变量等同步原语保护共享数据;避免使用全局变量;...

    linux网络编程(源码).rar

    9. **性能优化**:理解网络延迟、带宽限制、TCP窗口大小调整等因素,有助于优化网络应用的性能。 10. **网络协议的理解**:除了TCP/IP,还有HTTP、FTP、DNS等众多网络协议。理解它们的工作方式,可以使你的网络编程...

    linux server服务器性能优化

    CPU选择了Intel至强E5620,这是一款四核八线程的处理器,适合处理多线程任务,如邮件服务通常涉及的大量并发连接。主板选用超微X8DTL-I,支持ECC内存,确保数据完整性。内存8GB DDR3 ECC服务器内存,ECC内存可以防止...

    phread 详解

    - 使用`ulimit -s unlimited`命令临时增加栈大小限制。 2. **资源暂时不可用导致的`EAGAIN`错误**: - 在高并发场景下,系统资源可能暂时不足,可以适当增加系统的线程数限制。 - 调整系统配置文件`/etc/...

    程序的内存分配

    栈的大小是可扩展的,可以通过系统调用来增加栈的大小,但如果栈溢出,则会导致程序崩溃。 #### 堆管理 与栈不同,堆支持运行时动态内存分配。大多数编程语言都提供了堆内存管理的功能,例如通过`malloc()`函数...

    stack.zip_Linux/Unix编程_C/C++_

    堆栈的大小影响着线程能够处理的函数调用深度,如果堆栈空间不足,可能会导致栈溢出,这是程序运行时的一个严重问题。 在Linux和Unix系统中,线程堆栈的大小可以通过以下方式操作: 1. **pthread_attr_t**: 这是...

    pthread.rar_Linux/Unix编程_Unix_Linux_

    `pthread_attr_t`结构体用于设置线程属性,如栈大小、调度策略和优先级等。创建线程时,可以使用`pthread_attr_init()`初始化属性,然后用`pthread_create()`传递。 8. **线程分离** 使用`pthread_attr_...

    java问题定位技术

    - 程序计数器、虚拟机栈和本地方法栈:存放线程私有的数据。 ##### 3.2 Java内存泄漏的症状 **内存泄漏的症状**包括: 1. **为什么会发生OOM(OutOfMemroy)问题**? - 当内存消耗达到JVM的最大限制时,会导致此...

Global site tag (gtag.js) - Google Analytics