关于32位Linux系统内存溢出问题的情况及几种常见解决方法

关于32位Linux系统内存溢出问题的情况及
几种常见解决方法
由于近期Xenserver系统的OOMkill引起的批量虚拟机hang死以及刀片宕机重启问题,所以针对Out of memory 问题进行了了解和熟悉。

根据查阅网上一些文档LINUX系统具有OOM Killer的保护机制,用于避免Linux 在内存不足的时候不至于出太严重的问题,把一些无关紧要的进程杀掉,以保证系统的正常运行。

内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理的地址空间的大小,该地址空间就被称为虚拟地址空间,因此32位CPU的虚拟地址空间大小是2的32次方=4 294 967 296为4G,这和实际的物理内存数量无关。

Linux内核将虚拟地址空间分成了两部分:
一部分是用户进程可用的,这部分地址是地址空间的低地址部分,从0到TASK_SIZE,称为用户空间;
一部分是由内核保留使用的,这部分地址是地址空间的高地址部分,从KERNELBASE到结束,称为内核空间;
所以在32位系统,一个进程的可寻址范围是有限的
Linux内核定义了下面三个区域:
# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 - <硬件特定>
其中LowMem 区(也叫NORMAL ZONE ) 一共880 MB,而且不能改变(除非用hugemem 内核)。

对于高负载的系统,就可能因为LowMem 利用不好而引发OOM Killer 。

一个可能原因是LowFree 太少了,另外一个原因是LowMem 里都是碎片,请求不到连续的内存区域
检查当前LowFree 的值:
# cat /proc/meminfo |grep LowFree
检查LowMem内存碎片:
# cat /proc/buddyinfo
上面这条命令要在2.6 Kernel 环境下有效。

有如下方法可以解决该问题:
1.升级到64位系统,这是最好的方法,因为此时内核的寻址范围为2的64次方,所有内存都属low memory,如此时提示out of memory,则真的是low memory耗尽了。

(目前云桌面xenserver位linux32位SMP内核
2.6.32.12-0.7.1版本)
2. 如必须使用32位系统,那么可以使用hugemem内核,此时内核会以不同的方式分割low/high memory,而大多数情况下会提供足够多的low memory至high memory的映射,此时很简单的一个修复方法是可以安装hugemem内核包,然后重启。

备注:RedHat建议当物理内存在16GB之内,用SMP” kernel,在16GB-64GB之间使用”Hugemem”kernel.这是因为虚拟地址空间里有1G用于内核空间,而3G用于用户空间。

而关健的一些数据结构是存放在1G内核空间的,在管理32G内存当中,需要用到0.5G来用于管理这些物理内存(容易触发OOM killer).虽然32位OS下,内核和用户空间的比例都是1:3,但Hugemem打了一个补丁,使比例成为4G:4G,即使内核空间和用户空间相互独立,所以也会有性能上的损失,因为应用程序的运行,通常会有内核和用户空间的切换。

所以如果内存大于16G,建议使用64位的OS。

3.如果hugemem内核也用不了,那么我们可以尝试将/proc/sys/vm/lower_zone_protection
的值设为250或更大,可使用如下命令查看和设置该值:
cat /proc/sys/vm/lower_zone_protection
echo 250 > /proc/sys/vm/lower_zone_protection
或者可以修改/etc/sysctl.conf文件,以便重启后生效,添加的内容如下:
vm.lower_zone_protection = 250
备注:RHEL 4 ,新增了一个参数:vm.lower_zone_protection 。

这个参数默认的单位为MB,默认0 的时候,LowMem 为16MB。

建议设置vm.lower_zone_protection = 200 甚至更大以避免LowMem 区域的碎片,能解决这个问题(这参数就是解决这个问题出来的)。

4.实在没办法,那么我们把oom-killer关掉,不过该选项可能导致系统挂起,故要看实际情况使用。

查看当前的oom-killer的状态:cat /proc/sys/vm/oom-kill
关闭/打开oom-killer:
echo "0" > /proc/sys/vm/oom-kill
echo "1" > /proc/sys/vm/oom-kill
或者直接加到/etc/sysctl.conf文件,内容如下:
vm.oom-kill = 0
此时,当进程被oom-killer尝试杀死而没有成功时,会把相关信息记录到/var/log/messages 文件中,信息如下:
"Would have oom-killed but /proc/sys/vm/oom-kill is disabled"
5.或者不把oom-killer关掉,只针对单一进程处理,把某个进程保护起来,此时,我们可以使用如下命令:
echo -17 > /proc/[pid]/oom_adj
/proc/[pid]/oom_adj中oom_adj的取值范围是-17~15,当该值为-17时,系统将不会杀死指定pid的进程,而-16~15则会使得进程的/proc/[pid]/oom_adj值呈指数(K*2^n)形式递增,即它们被杀掉的可能性呈指数递增。

针对init(进程号为1)这个进程,无论该值设为多少都不会被杀。

6.另外思杰厂家反映打ctx xenserver024和0332个补丁可以避免该OOMkill问题的出现。

合集下载

解决溢出问题的方法

解决溢出问题的方法

解决溢出问题的方法
解决溢出问题的方法主要有以下几种:
1. 代码审查和优化:通过仔细审查代码,找出可能导致溢出的源头,如大量数据的处理、循环引用等。

优化这些代码段,减少内存使用。

2. 调整内存参数:调整JVM的启动参数,如-Xms和-Xmx参数,可以动态调整内存分配。

这可以帮助避免内存溢出。

3. 使用内存分析工具:使用内存分析工具(如MAT)来分析内存使用情况,找出并解决内存泄漏问题。

4. 避免大对象分配:尽量避免一次性分配大量内存,可以将大任务拆分成小任务,逐个处理。

5. 优化数据库查询:数据库查询可能导致大量数据加载到内存中,可以通过优化查询语句,减少数据加载量。

6. 升级硬件:在某些情况下,增加物理内存或升级其他硬件(如硬盘)可能有助于解决溢出问题。

7. 使用缓存技术:对于频繁使用的数据,可以使用缓存技术来减少对数据库的访问,从而减少内存使用。

8. 日志分析:仔细分析应用程序日志,查找可能导致溢出的异常或错误。

9. 垃圾回收优化:根据应用程序的特点,选择合适的垃圾回收策略,以减少内存碎片和垃圾回收开销。

10. 避免第三方软件BUG:确保使用的第三方软件没有已知的内存泄漏问题或BUG,并及时更新软件。

这些方法可以根据实际情况进行选择和应用,一般需要通过不断测试和调优来找到最适合的解决方案。

排查内存溢出的方法和步骤

排查内存溢出的方法和步骤

排查内存溢出的方法和步骤内存溢出是软件开发中常见的问题,它会严重影响程序的性能和稳定性。

为了确保软件的优质运行,及时排查和解决内存溢出问题至关重要。

本文将详细介绍排查内存溢出的方法和步骤。

一、了解内存溢出在排查内存溢出之前,我们需要了解什么是内存溢出。

内存溢出是指程序在运行过程中,申请的内存超过了系统能够提供的最大内存限制,导致程序无法正常运行。

内存溢出主要有以下几种类型:1.堆内存溢出:指程序在堆内存中申请的空间超过了限制。

2.栈内存溢出:指程序在栈内存中申请的空间超过了限制。

3.全局内存溢出:指程序在全局内存中申请的空间超过了限制。

二、排查内存溢出的方法1.分析程序代码(1)检查内存申请和释放的逻辑是否正确。

(2)检查是否存在内存泄露的情况,如已释放的内存还被程序使用。

(3)检查程序中是否存在大量临时对象创建和销毁,导致内存频繁申请和释放。

2.使用内存分析工具(1)Visual Studio Memory Profiler:适用于Windows平台的内存分析工具,可以监测程序运行过程中的内存使用情况,定位内存溢出问题。

(2)Valgrind:适用于Linux平台的内存分析工具,可以检测内存泄露、内存越界等问题。

(3)Xcode Memory Graph:适用于iOS和macOS平台的内存分析工具,可以查看内存使用情况,分析内存泄露等问题。

3.动态监测内存使用在程序运行过程中,实时监测内存使用情况,观察内存是否持续上升。

可以通过以下方法进行动态监测:(1)编写内存监控代码,定期输出程序内存使用情况。

(2)使用操作系统提供的命令行工具,如Windows的任务管理器、Linux的top和ps命令等。

三、排查内存溢出的步骤1.确定内存溢出的类型和范围。

2.使用分析工具或动态监测方法,定位内存溢出的问题代码。

3.修复问题代码,如优化内存申请和释放逻辑、消除内存泄露等。

4.重新运行程序,验证内存溢出问题是否已解决。

导致内存溢出原因有哪些内存溢出问题又如何解决

导致内存溢出原因有哪些内存溢出问题又如何解决

导致内存溢出原因有哪些内存溢出问题又如何解决内存溢出的原因以及解决方法1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多重复的对象实体; 4.使用的第三方软件中的BUG; 5.启动参数内存值设定的过小内存溢出的解决方案:第一步,修改JVM启动参数,直接增加内存。

(-某m,-某m某参数一定不要忘记加。

)第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

重点排查以下几点: 1.检查对数据库查询中,是否有一次获得全部数据的查询。

一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。

这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。

因此对于数据库查询尽量采用分页的方式查询。

2.检查代码中是否有死循环或递归调用。

3.检查是否有大循环重复产生新对象实体。

4.检查对数据库查询中,是否有一次获得全部数据的查询。

一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。

这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。

因此对于数据库查询尽量采用分页的方式查询。

5.检查Lit、MAP等集合对象是否有使用完后,未清除的问题。

Lit、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

第四步,使用内存查看工具动态查看内存使用情况。

电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理在我们日常使用电脑的过程中,可能会遇到电脑开机后出现内存溢出的情况。

这是一个让人颇为头疼的问题,不仅会影响电脑的运行速度,还可能导致程序崩溃、系统死机等严重后果。

那么,当遇到这种情况时,我们应该如何处理呢?下面就来给大家详细介绍一下。

首先,我们需要了解什么是内存溢出。

简单来说,内存溢出就是指程序在运行过程中,申请的内存空间超过了系统所能提供的最大内存空间,从而导致程序无法正常运行。

这种情况通常发生在运行大型程序、多个程序同时运行或者电脑内存本身较小的情况下。

当电脑开机后出现内存溢出时,第一步我们可以尝试重新启动电脑。

有时候,可能只是系统的一时错误或者某个程序的异常导致了内存溢出,通过重启电脑,系统会重新初始化,可能会解决这个问题。

如果重启电脑后问题仍然存在,那么我们就需要深入排查原因了。

首先,检查一下是否有程序在后台大量占用内存。

可以打开任务管理器(按下 Ctrl + Shift + Esc 组合键),查看各个进程的内存使用情况。

如果发现某个程序占用内存过高,比如一些大型游戏、图形设计软件等,而此时您又不需要使用这些程序,可以将其关闭,以释放内存。

另外,电脑中的病毒和恶意软件也可能导致内存溢出。

因此,及时进行病毒扫描和查杀是很有必要的。

您可以使用电脑自带的杀毒软件或者第三方杀毒软件进行全面扫描,清除可能存在的病毒和恶意软件。

接下来,检查一下电脑的虚拟内存设置。

虚拟内存是在硬盘上开辟的一块空间,用于在物理内存不足时充当临时内存。

如果虚拟内存设置过小,也可能导致内存溢出。

在 Windows 系统中,您可以通过以下步骤设置虚拟内存:右键点击“我的电脑”,选择“属性”,然后在“高级系统设置”中点击“性能”选项下的“设置”,再切换到“高级”选项卡,点击“更改”按钮,在这里可以自定义虚拟内存的大小。

一般来说,建议将虚拟内存设置为物理内存的 15 到 2 倍。

除了以上方法,如果您的电脑内存本身较小,那么考虑升级内存也是一个不错的选择。

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案内存溢出是指程序在运行过程中申请的内存超过了系统或者进程所能提供的上限。

导致内存溢出的原因可能是程序中存在内存泄漏、内存分配过多或者递归调用过深等。

下面将介绍三种常见的内存溢出情况及其系统配置解决方案。

1.程序内存泄漏导致内存溢出:内存泄漏指程序在运行过程中动态分配内存空间后,没有对其进行释放,导致一部分内存无法再次使用。

长时间运行的程序中,如果内存泄漏较为严重,系统可用内存会不断减少,直到最终耗尽所有内存资源。

解决方案:使用内存泄漏检测工具来检测和修复程序中的内存泄漏问题。

同时,可以考虑使用自动内存管理的编程语言,如Java和Python,在程序运行过程中自动回收未使用的内存。

2.内存分配过多导致内存溢出:解决方案:优化程序的内存使用,尽可能减小内存分配的数量和大小。

可以通过使用更高效的内存管理算法来减少内存碎片,或者使用内存池技术来提前分配一定量的内存供程序使用。

3.递归调用过深导致内存溢出:递归函数在每次调用时会将一定量的数据压入栈中,如果递归调用层数过深,栈的空间可能会超过系统的限制,从而导致内存溢出。

这种情况通常发生在没有设置递归终止条件或者递归层数过多的情况下。

解决方案:优化递归算法,设置合适的递归终止条件,避免递归调用过深。

如果无法避免使用递归算法,可以考虑使用尾递归或者迭代算法来替代递归调用,减少栈的压力。

在系统配置方面,可以采取以下措施来预防和解决内存溢出问题:1.增加系统内存容量:如果内存溢出是由于系统可用内存不足引起的,可以考虑增加系统的内存容量。

这可以通过增加物理内存条或者使用虚拟内存技术来实现。

虚拟内存技术会将部分磁盘空间用作缓存,并将一部分数据暂时存储在磁盘上,以释放内存空间。

2. 调整JVM参数:对于使用Java虚拟机(JVM)的应用程序,可以通过调整JVM的参数来控制内存的分配和管理。

例如,可以通过设置-Xmx参数来限制JVM使用的最大堆内存大小,或者通过设置-XX:MaxPermSize参数来限制JVM使用的最大持久代(PermGen)内存大小。

电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理在使用电脑的过程中,我们可能会遇到电脑开机后出现内存溢出的情况。

这是一个让人颇为头疼的问题,不仅会影响电脑的正常运行,还可能导致数据丢失或系统崩溃。

那么,当我们遇到这种情况时,应该如何处理呢?首先,我们需要了解一下什么是内存溢出。

简单来说,内存溢出就是指程序在运行过程中,申请的内存空间超过了系统所能提供的最大内存空间,从而导致程序无法正常运行。

在电脑开机后出现内存溢出,可能是由于多种原因引起的。

一种常见的原因是电脑同时运行的程序过多,占用了大量的内存资源。

比如,我们在开机时自动启动了多个大型软件或进程,这些程序会在后台持续运行,消耗大量的内存。

因此,我们可以检查一下电脑的启动项,关闭一些不必要的自启动程序。

具体操作方法是按下“Ctrl+ Shift +Esc”组合键打开任务管理器,在“启动”选项卡中,禁用那些不需要开机自启的程序。

另外,电脑中存在恶意软件或病毒也可能导致内存溢出。

这些恶意程序可能会在后台偷偷运行,占用大量系统资源。

所以,我们要及时使用杀毒软件对电脑进行全面扫描,清除可能存在的恶意软件和病毒。

同时,要保持杀毒软件的实时更新,以确保能够有效地防御新出现的威胁。

内存不足也是导致内存溢出的一个重要原因。

如果电脑的物理内存本身较小,而我们又在运行一些对内存要求较高的程序,就很容易出现内存溢出的情况。

在这种情况下,我们可以考虑升级电脑的内存。

在购买新的内存之前,需要了解电脑主板支持的内存类型和最大容量,然后选择合适的内存条进行安装。

此外,系统或软件的错误或漏洞也可能引发内存溢出问题。

对于这种情况,我们可以尝试更新系统和相关软件到最新版本。

通常,软件和系统的开发者会在新版本中修复已知的漏洞和错误,从而提高系统的稳定性和兼容性。

除了上述方法,我们还可以通过一些系统设置来优化内存使用。

比如,调整虚拟内存的大小。

虚拟内存是当物理内存不足时,系统从硬盘中划分出的一部分空间作为内存使用。

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案内存溢出是指程序在运行过程中申请的内存超过了系统所分配的内存空间,导致程序崩溃或出现异常。

内存溢出通常是由于程序设计或系统配置问题引起的。

以下是三种常见的内存溢出情况及相应的系统配置解决方案。

1.单个进程占用内存过大:当一些进程在运行过程中占用的内存超过系统分配的限制时,就会导致内存溢出。

这种情况通常发生在大型应用程序或者后台服务运行时。

解决方案:-增加物理内存:在服务器或计算机中增加物理内存,以满足进程运行所需的内存空间。

-调整虚拟内存:将物理内存和虚拟内存结合使用,允许操作系统使用虚拟内存作为物理内存的扩展,从而提供更大的内存容量。

-优化应用程序:通过优化程序代码、降低内存使用、合理管理资源等方法,减少进程对内存的占用。

2.长时间运行的应用程序产生泄露:有些应用程序在长时间运行后会产生内存泄露的问题,即分配并使用内存后没有将其释放,导致内存占用逐渐增加,最终导致内存溢出。

解决方案:-使用垃圾回收机制:在一些支持垃圾回收的编程语言中,通过垃圾回收机制可以自动释放未使用的内存。

开发人员可以使用这些机制来解决内存泄露问题。

-引入内存监控工具:使用内存监控工具来检测应用程序中的内存泄露,定位并解决导致内存泄露的代码问题。

-定期重启应用程序:定期重启应用程序可以清理内存,防止内存泄露导致内存溢出。

3.大规模并发请求导致内存压力增加:在高并发的情况下,当系统同时处理大量的请求时,每个请求所占用的内存可能累积增加,导致整体内存压力增加,最终出现内存溢出。

解决方案:-加大系统负载均衡能力:通过增加负载均衡器、引入缓存机制等方式,将请求分散到多台服务器上,减少单台服务器的内存压力。

-优化数据库访问:对于一些频繁读写数据库的操作,可以通过合理的数据库设计、使用索引、缓存查询结果等方法,减少对数据库的访问,降低内存压力。

-调整服务器配置:合理设置服务器的最大并发连接数、线程池大小等参数,根据实际需求分配内存资源。

电脑内存泄漏该如何诊断和修复

电脑内存泄漏该如何诊断和修复在我们日常使用电脑的过程中,可能会遇到各种各样的问题,其中内存泄漏就是一个比较常见但又让人头疼的情况。

内存泄漏指的是程序在运行过程中,不断地分配内存但没有及时释放不再使用的内存,导致可用内存逐渐减少,最终可能会使系统性能下降,甚至出现程序崩溃的情况。

那么,当我们遇到电脑内存泄漏时,该如何诊断和修复呢?下面就让我们一起来探讨一下。

一、内存泄漏的症状在诊断内存泄漏之前,我们首先需要了解一些内存泄漏可能导致的症状。

以下是一些常见的表现:1、系统运行速度逐渐变慢随着时间的推移,您可能会发现电脑的响应速度变得越来越慢,打开程序、文件或进行其他操作时都需要更长的时间。

2、频繁出现内存不足的错误提示当内存泄漏严重时,系统可能会弹出“内存不足”的警告,提示您关闭一些程序以释放内存。

3、程序崩溃或异常退出某些程序可能会突然崩溃,或者在运行过程中出现异常错误,无法正常工作。

4、系统重启或死机如果内存泄漏问题非常严重,可能会导致系统重启甚至死机,使您正在进行的工作丢失。

二、诊断内存泄漏的方法当我们怀疑电脑存在内存泄漏问题时,可以通过以下几种方法来进行诊断:1、任务管理器在 Windows 系统中,我们可以通过按下 Ctrl + Shift + Esc 组合键打开任务管理器。

在“性能”选项卡中,可以查看当前的内存使用情况。

如果发现内存使用率一直处于高位,并且在关闭一些程序后仍然没有下降,那么就有可能存在内存泄漏。

2、资源监视器Windows 系统还提供了资源监视器工具,可以更详细地查看内存的使用情况。

按下 Win + R 键,输入“resmon”并回车即可打开。

在资源监视器中,可以查看每个进程的内存使用情况,包括提交大小、工作集、私有工作集等。

通过观察这些数据的变化,可以判断是否有进程存在内存泄漏。

3、性能监视器通过性能监视器(在 Windows 系统中可以在控制面板中找到),我们可以创建一个自定义的性能计数器来监测内存的使用情况。

linux系统故障及解决方法

linux系统故障及解决方法
Linux系统在使用过程中,难免会出现各种故障。

这些故障有些是因为用户的误操作,有些则是由于系统本身的问题所导致。

下面是一些常见的Linux系统故障及其解决方法。

1. 内存泄漏
内存泄漏指的是在程序运行过程中,申请的内存一直得不到释放,最终会导致系统崩溃。

通常情况下,内存泄漏是由于程序中存在漏洞或者编程不良造成的。

解决方法是通过工具检测内存泄漏,找出问题代码并进行修复。

2. 网络连接问题
Linux系统中,网络连接问题可能是由于网络协议配置不正确或者网络设备出现故障所导致。

解决方法是通过检查网络协议的配置以及检测网络设备的连接状态,找出问题所在并进行修复。

3. 硬盘故障
硬盘故障是指硬盘出现物理损坏或者软件问题导致无法正常工作。

解决方法是通过硬件检测工具对硬盘进行检测,找出问题并进行修复,或者更换故障硬盘。

4. 系统崩溃
系统崩溃是指系统出现严重的错误,导致系统无法正常工作。

解决方法是通过系统日志找出错误信息,然后进行相应的修复工作。

5. 软件安装问题
在Linux系统中,软件安装可能会出现依赖关系、版本不兼容等
问题。

解决方法是通过包管理工具进行软件安装或者手动安装所需的依赖库,确保软件正常运行。

总之,Linux系统故障的解决方法需要根据具体情况进行分析和解决,有时候需要借助一些工具,有时候则需要手动修复。

但是,无论出现什么故障,及时处理才能避免更大的损失。

如何解决内存溢出问题

如何解决内存溢出问题?2004-12-2 17:07:28在程序员设计的代码中包含的“内存溢出”漏洞实在太多了。

本文将给大家介绍内存溢出问题的产生根源、巨大危害和解决途径。

一、为什么会出现内存溢出问题?导致内存溢出问题的原因有很多,比如:(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。

(2) 以不可靠的方式存取或者复制内存缓冲区。

(3) 编译器设置的内存缓冲区太靠近关键数据结构。

下面来分析这些因素:1. 内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。

众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。

只要合理编码,C/C++ 应用程序在执行效率上必然优于其它高级语言。

然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。

其他语言也存在内容溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。

2. 当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了 N 字节大小的内存缓冲区,随后又向其中复制超过 N 字节的数据)。

内存缓冲区就可能会溢出。

想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出来的 4 盎司水怎么办?当然会满到玻璃杯外面了!3. 最重要的是,C/C++ 编译器开辟的内存缓冲区常常邻近重要的数据结构。

现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。

此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。

这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档