Linux内存泄露与溢出

Linux内存泄漏检测方法总结 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示内存检测方式无非分为两种:1、维护一个内存操作链表,当有内存申请操作时,将其加入此链表中,当有释放操作时,从申请操作从链表中移除。 阅读详情

Linux系统下真正有危害的是内存泄漏的堆积,这会最终消耗尽系统任何的内存。下面是排查和解决方案与大家一起分享。

1、Linux 内存监控内存泄漏的定义:

一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程式从堆中分配的,大小任意的(内存块的大小能够在程式运行期决定),使用完后必须显示释放的内存。应用程式一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程式必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

2、Linux 内存监控内存泄露的危害

从用户使用程式的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统任何的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为他不会堆积,而隐式内存泄漏危害性则很大,因为较之于常发性和偶发性内存泄漏他更难被检测到。存在内存泄漏问题的程式除了会占用更多的内存外,还会使程式的性能急剧下降。对于服务器而言,假如出现这种情况,即使系统不崩溃,也会严重影响使用。

3、Linux 内存监控内存泄露的检测和回收

对于内存溢出之类的麻烦可能大家在编写指针比较多的复杂的程式的时候就会碰到。在 Linux 或 unix 下,C、C++语言是最使用工具。但是我们的 C++ 程式缺乏相应的手段来检测内存信息,而只能使用 top 指令观察进程的动态内存总额。而且程式退出时,我们无法获知任何内存泄漏信息。

使用kill命令

使用Linux命令回收内存,我们能够使用Ps、Kill两个命令检测内存使用情况和进行回收。在使用终极用户权限时使用命令“Ps”,他会列出任何正在运行的程式名称,和对应的进程号(PID)。Kill命令的工作原理是:向Linux操作系统的内核送出一个系统操作信号和程式的进程号(PID)。

应用例子:

为了高效率回收内存能够使用命令ps 参数v:

[root@www ~]# ps v(或aux)

PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND

2542 tty1Ss+ 0:00 08 1627 428 0.1 /sbin/mingetty tty1

2543 tty2Ss+ 0:00 08 1631 428 0.1 /sbin/mingetty tty2

2547 tty3Ss+ 0:00 08 1631 432 0.1 /sbin/mingetty tty3

2548 tty4Ss+ 0:00 08 1627 428 0.1 /sbin/mingetty tty4

2574 tty5Ss+ 0:00 08 1631 432 0.1 /sbin/mingetty tty5

2587 tty6Ss+ 0:00 08 1627 424 0.1 /sbin/mingetty tty6

2657 tty7Ss+ 1:1812 1710 29981 7040 3.0 /usr/bin/Xorg :0 -br -a

2670 pts/2 Ss0:01 2 682 6213 1496 0.6 -bash

3008 pts/4 Ss0:00 2 682 6221 1472 0.6 /bin/bash

3029 pts/4 S+0:00 2 32 1783 548 0.2 ping 192.168.1.12

3030 pts/2 R+0:00 2 73 5134 768 0.3 ps v

然后假如想回收Ping命令的内存的话,使用命令:

# Kill -9 3029

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。

这是程序语言中的一个概念,典型的,在C语言中,在分配数组时为其分配的长度是1024,但往其中装入超过1024个数据时,由于C语言不会对数组操作进行越界检查,就会造成内存溢出错误 

在程序员设计的代码中包含的“内存溢出”漏洞实在太多了。本文将给大家介绍内存溢出问题的产生根源、巨大危害和解决途径。
一、为什么会出现内存溢出问题?
导致内存溢出问题的原因有很多,比如:
(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++ 编译器开辟的内存缓冲区常常邻近重要的数据结构。现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。非但如此,C++ 的某些其它数据结构,比如 v-table 、例外事件处理程序、函数指针等,也可能受到类似的攻击。
好,闲话少说,现在来看一个具体的例子。
请思考:以下代码有何不妥之处?
void CopyData(char *szData) {
char cDest[32];
strcpy(cDest,szData);
// 处理 cDest
…
}
奇怪,这段代码好象没什么不对劲啊!确实,只有调用上述 CopyData() 才会出问题。例如:这样使用 CopyData() 是安全的:
char *szNames[] = {"Michael","Cheryl","Blake"};
CopyData(szName[1]);
为什么呢?因为数组中的姓名("Michael"、"Cheryl"、"Blake")都是字符串常量,而且长度都不超过 32 个字符,用它们做 strcpy() 的参数总是安全的。再假设 CopyData 的唯一参数 szData 来自 socket 套接字或者文件等不可靠的数据源。由于 strcpy 并不在乎数据来源,只要没遇上空字符,它就会一个字符一个字符地复制 szData 的内容。此时,复制到 cDest 的字符串就可能超过 32 字符,进而导致内存缓冲区 cDest 的溢出;溢出的字符就会取代内存缓冲区后面的数据。不幸的是,CopyData 函数的返回地址也在其中!于是,当 CopyData 函数调用完毕以后,程序就会转入攻击者给出的“返回地址”,从而落入攻击者的圈套!授人以柄,惨!
前面提到的其它数据结构也可能受到类似的攻击。假设有人利用内存溢出漏洞覆盖了下列 C++ 类中的 v-table :
void CopyData(char *szData) {
char cDest[32];
CFoo foo;
strcpy(cDest,szData);
foo.Init();
}
与其它 C++ 类一样,这里的 CFoo 类也对应一个所谓的 v-table,即用于保存一个类的全部方法地址的列表。若攻击者利用内存溢出漏洞偷换了 v-table 的内容,则 CFoo 类中的所有方法,包括上述 Init() 方法,都会指向攻击者给出的地址,而不是原先 v-table 中的方法地址。顺便说一句,即使你在某个 C++ 类的源代码中没有调用任何方法,也不能认为这个类是安全的,因为它在运行时至少需要调用一个内部方法——析构器(destructor)!当然,如果真有一个类没有调用任何方法,那么它的存在意义也就值得怀疑了。
二、解决内存溢出问题
不要太悲观,下面讨论内存溢出问题的解决和预防措施。
1、改用受控代码
2002 年 2 月和 3 月,微软公司展开了 Microsoft Windows Security Push 活动。在此期间,我所在的小组一共培训了超过 8500 人,教授他们如何在设计、测试和文档编制过程中解决安全问题。在我们向所有程序设计人员提出的建议中,有一条就是:紧跟微软公司软件开发策略的步伐,将某些应用程序和工具软件由原先基于本地 Win32 的 C++ 代码改造成基于 .NET 的受控代码。我们的理由很多,但其中最根本的一条,就是为了解决内存溢出问题。基于受控代码的软件发生内存溢出问题的机率要小得多,因为受控代码无法直接存取系统指针、寄存器或者内存。作为开发人员,你应该考虑(至少是打算)用受控代码改写某些应用程序或工具软件。例如:企业管理工具就是很好的改写对象之一。当然,你也应该很清楚,不可能在一夜之间把所有用 C++ 开发的软件用 C# 之类的受控代码语言改写。
2、遵守黄金规则
当你用 C/C++ 书写代码时,应该处处留意如何处理来自用户的数据。如果一个函数的数据来源不可靠,又用到内存缓冲区,那么它就必须严格遵守下列规则:
  • 必须知道内存缓冲区的总长度。
  • 检验内存缓冲区。
  • 提高警惕。
让我们来具体看看这些“黄金规则”:
(1)必须知道内存缓冲区的总长度。
类似这样的代码就有可能导致 bug :
void Function(char *szName) {
char szBuff[MAX_NAME];
// 复制并使用 szName
strcpy(szBuff,szName);
}
它的问题出在函数并不知道 szName 的长度是多少,此时复制数据是不安全的。正确的做法是,在复制数据前首先获取 szName 的长度:
void Function(char *szName, DWORD cbName) {
char szBuff[MAX_NAME];
// 复制并使用 szName
if (cbName < MAX_NAME)
strcpy(szBuff,szName);
}
这样虽然有所改进,可它似乎又过于信任 cbName 了。攻击者仍然有机会伪造 czName 和 szName 两个参数以谎报数据长度和内存缓冲区长度。因此,你还得检检这两个参数!
(2)检验内存缓冲区
如何知道由参数传来的内存缓冲区长度是否真实呢?你会完全信任来自用户的数据吗?通常,答案是否定的。其实,有一种简单的办法可以检验内存缓冲区是否溢出。请看如下代码片断:
void Function(char *szName, DWORD cbName) {
char szBuff[MAX_NAME];
// 检测内存
szBuff[cbName] = 0×42;
// 复制并使用 szName
if (cbName < MAX_NAME)
strcpy(szBuff,szName);
}
这段代码试图向欲检测的内存缓冲区末尾写入数据 0×42 。你也许会想:真是多此一举,何不直接复制内存缓冲区呢?事实上,当内存缓冲区已经溢出时,一旦再向其中写入常量值,就会导致程序代码出错并中止运行。这样在开发早期就能及时发现代码中的 bug 。试想,与其让攻击者得手,不如及时中止程序;你大概也不愿看到攻击者随心所欲地向内存缓冲区复制数据吧。
(3)提高警惕
虽然检验内存缓冲区能够有效地减小内存溢出问题的危害,却不能从根本上避免内存溢出攻击。只有从源代码开始提高警惕,才能真正免除内存溢出攻击的危胁。不错,上一段代码已经很对用户数据相当警惕了。它能确保复制到内存缓冲区的数据总长度不会超过 szBuff 的长度。然而,某些函数在使用或复制不可靠的数据时也可能潜伏着内存溢出漏洞。为了检查你的代码是否存在内存溢出漏洞,你必须尽量追踪传入数据的流向,向代码中的每一个假设提出质疑。一旦这么做了,你将会意识到其中某些假设是错误的;然后你还会惊讶地叫道:好多 bug 呀!
在调用 strcpy、strcat、gets 等经典函数时当然要保持警惕;可对于那些所谓的第 n 版 (n-versions) strcpy 或 strcat 函数 —— 比如 strncpy 或 strncat (其中 n = 1,2,3 ……) —— 也不可轻信。的确,这些改良版本的函数是安全一些、可靠一些,因为它们限制了进入内存缓冲区的数据长度;然而,它们也可能导致内存溢出问题!请看下列代码,你能指出其中的错误吗?
#define SIZE(b) (sizeof(b))
char buff[128];
strncpy(buff,szSomeData,SIZE(buff));
strncat(buff,szMoreData,SIZE(buff));
strncat(buff,szEvenMoreData,SIZE(buff));
给点提示:请注意这些字符串函数的最后一个参数。怎么,弃权?我说啊,如果你是执意要放弃那些“不安全”的经典字符串函数,并且一律改用“相对安全”的第 n 版函数的话,恐怕你这下半辈子都要为了修复这些新函数带来的新 bug 而疲于奔命了。呵呵,开个玩笑而已。为何这么说?首先,它们的最后一个参数并不代表内存缓冲区的总长度,它们只是其剩余空间的长度;不难看出,每执行完一个 strn… 函数,内存缓冲区 buff 的长度就减少一些。其次,传递给函数的内存缓冲区长度难免存在“大小差一”(off-by-one)的误差。你认为在计算 buff 的长度时包括了字符串末尾的空字符吗?当我向听众提出这个问题时,得到的肯定答复和否定答复通常是 50 比 50 ,对半开。也就是说,大约一半人认为计算了末尾的空字符,而另一半人认为忽略了该字符。最后,那些第 n 版函数所返回的字符串不见得以空字符结束,所以在使用前务必要仔细阅读它们的说明文档。
3、编译选项 /GS
“/GS”是 Visual C++ .NET 新引入的一个编译选项。它指示编译器在某些函数的堆栈帧(stack-frames) 中插入特定数据,以帮助消除针对堆栈的内存溢出问题隐患。切记,使用该选项并不能替你清除代码中的内存溢出漏洞,也不可能消灭任何 bug 。它只是亡羊补牢,让某些内存溢出问题隐患无法演变成真正的内存溢出问题;也就是说,它能防止攻击者在发生内存溢出时向进程中插入和运行恶意代码。无论如何,这也算是小小的安全保障吧。请注意,在新版的本地 Win32 C++ 中使用 Win32 应用程序向导创建新项目时,默认设置已经打开了此选项。同样,Windows .NET Server 环境也默认打开了此选项。关于 /GS 选项的更多信息,请参考 Brandon Bray 的《Compiler Security Checks In Depth》一书。
三、请指出安全漏洞
最后,请大家看一段代码,其中存在至少一个安全漏洞。你发现了吗?在后续文章中将会给出答案!
WCHAR g_wszComputerName[INTERNET_MAX_HOST_NAME_LENGTH + 1];
// 获取服务器名,再将它转成 Unicode 字符串。
BOOL GetServerName (EXTENSION_CONTROL_BLOCK *pECB) {
DWORD dwSize = sizeof(g_wszComputerName);
char szComputerName[INTERNET_MAX_HOST_NAME_LENGTH + 1];
if (pECB->GetServerVariable (pECB->ConnID,
"SERVER_NAME",
szComputerName,
&dwSize)) {


http://blog.youkuaiyun.com/tiangwan2011/article/details/7904111

小白学JVM调优一: 三种场景模拟OOM获得dump文件 小白学JVM调优一: 三种场景模拟OOM获得dump文件 三种场景模拟OOM获得dump文件 实操一. mac 用idea启动main方法导致堆内存溢出,使用Eclipse Memory Analyzer分析: // VM option: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError // while循环往list对象中放对象 public class HeapOOM { static class OOMObject{ } public static 阅读详情

相关推荐

【论文分享】【Agent】ProAgent: Building Proactive Cooperative Agents with Large Language Models

多智能体系统是由多个智能体组成的集合,这些智能体可以是软件程序、机器人、传感器或其他实体,它们各自具备一定的智能和自主性,并通过交互协作来实现单个智能体难以完成的复杂目标。

nanxun___的博客 1124

内存溢出和解决方案!

<br /><br />Refer to URL:http://blog.donews.com/lasthome/archive/2006/03/26/793102.aspx<br />内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。<br />比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。<br />这是程序语言中的一个概念,典型的,在C语言中,在分配数组时为其分配的长度是1024,但往其中装入超过1024个数据时,由于C语言不会

figerDeng的专栏 1405

告别手动输入!用Access批量导入307种土壤数据到SWAT模型(附完整MDB操作流程)

本文详细介绍了如何利用Microsoft Access批量导入307种土壤数据到SWAT模型,显著提升数据录入效率。通过解析usersoil表结构、提供Access操作指南和VBA自动化脚本,帮助环境工程师避免手动输入错误,实现高效数据管理。文章还包含性能优化技巧和常见错误解决方案,是SWAT模型用户的实用指南。

weixin_28366053的博客 326

内存溢出常见原因及解决方法

引起内存溢出的原因有很多种,常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据。 解决方法:检查对数据库查询中,是否有一次获得全部数据的查询;对于数据库查询尽量采用分页的方式查询。 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收。 解决方法:检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的 引用,使得这些对象不能被GC回收。 3.代码中存在死循环或循环产生过多重复的对象实体。 解决方法:检查代码中是否有死循环

手写ArrayList 9520

金仓数据库KCM认证考试介绍【2025年4月更新】

金仓数据库认证资深专家KCM认证考试介绍

qq709869231的博客 3233

从 JDK8 到 JDK17:CRMEB 框架升级

【摘要】CRMEB开源框架已成功从JDK8升级至JDK17,带来显著性能提升:并发吞吐量提高35%,响应延迟降低40%,资源占用减少25%。升级方案解决87个技术卡点,支持模块化扩展和微服务转型,兼容SpringBoot3.0等新技术。提供基础版到企业级的升级服务,包含代码重构指导和性能调优。经金融级验证的方案可帮助电商平台实现日均10万+UV承载,支付成功率提升至99.7%。现以低于市场30%的价格提供全周期技术支持,助力企业抢占技术先机。

weixin_39782540的博客 701

C#内存泄漏原因整理

C#内存泄漏原因整理

雪中冰雨 4621

samba源码编译安装(版本4.13.0)

这里写目录标题前言编译安装samba下载三个包安装依赖共需要安装samba、gnutls、nettle1、进入解压后的samba目录执行:2、进入解压后的gnutls目录执行3、进入解压后的nettle目录执行3.1 卸载已存在nettle3.2 编译3.3 make3.4 安装4、进入gnutls继续编译4.1 编译4.2 make4.3 安装5、再次进入解压后的samba目录5.1 执行./configure5.2 make5.3 samba安装启动samba 前言 一般来说,安装samba最快的方式应

灵葱的博客 1万+

C++数组内存会有泄漏问题,还是不安全呢

vector color_list;void f(){double color[4] = {1.0,0.0,0.0,1.0};color_list.push_back(color);}这样定义会内存泄漏吗?我定义了个double color[4] = {1.0,0.0,0.0,1.0};然后保存了数组的指针然后这块内存会自动释放吗?小明:你那个指针是野指针啊如果你定义数组的那个函数结束,虽然空间

leemengfei的专栏 933

半导体设备上位机开发:我的经验与新人指导

半导体设备上位机开发是一项复杂而富有挑战性的工作,需要扎实的技术基础和丰富的经验。如果你对半导体设备上位机开发感兴趣,欢迎随时与我交流,我会尽力帮助你!

qq_43518667的博客 2731

用ADS2023手把手仿真SKYWORKS SMA1234变容二极管:从Datasheet到S参数结果全流程

本文详细介绍了如何使用ADS2023仿真SKYWORKS SMA1234变容二极管的全流程,从Datasheet参数解析到S参数结果验证。通过等效电路建模、关键公式编写和仿真设置,帮助工程师掌握变容二极管在射频电路设计中的应用技巧,提升仿真精度和工程实践能力。

weixin_29233333的博客 502

内存泄露 工具

文章目录linux解决内存泄露防止内存泄露内存池gc 垃圾回收[window 工具](https://blog.youkuaiyun.com/qq_23350817/article/details/90641856) 内存泄露 当使用 new/malloc 在堆上动态分配内存时,忘记使用 delete/free对内存进行回收,就出现了内存泄露。当大量的内存泄露出现时,就会影响服务器的性能和处理能力。 linux 解决内存泄露 top :查看当前系统运行的程序及其内存情况 通过虚拟内存的变化,如果运行时刻,

qq_40701470的博客 269

帆软报表导出各种格式之后台导出

我们前面介绍了帆软报表在界面上的导出是通过类似的URL:http://localhost:8075/webroot/decision/view/report?op=export&sessionID=10653244-3e46-408c-bc54-f89a214a9bc7&format=image&extype=PNG 来完成的,就是带OP=export以及format参数来完成的。如果不从界面传参数,比如我们自己实现了一个HTTP接口,也可以通过传参数format来完成各种格式的导

帆软爱好者的专栏 4270

c++ 系统内存检查(Linux)

c++ 系统内存检查(Linux) 文章目录c++ 系统内存检查(Linux)检查内存泄露检查堆溢出检查栈溢出检查全局内存溢出检查释放后继续使用 检查内存泄露 通过g++来检查内存泄露的问题 # g++ g++ -fsanitize=address -g -o testmen testmem.cpp # CMakeLists.txt 里面添加 set(CMAKE_CXX_FLAGS "-fsanitize=address") 使用-fsanitize=address开关以后,代码不用做任何改动,就自动具有

木元心的博客 3596

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

聊一聊 Valgrind 监视非托管内存泄露和崩溃

总的来说,Valgrind 在洞察内存方面还是非常强大的,但也有它不能触及到的地方,熟悉它的优点和缺点,全面了解对我们调试师来说至关重要,希望本篇对你有帮助。

一线码农的专栏 955

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux内核调试方法总结之序言 -------Good

come from :https://www.cnblogs.com/justin-y-lin/p/5424434.html 本系列主要介绍Linux内核死机、异常重启类稳定性问题的调试方法。 在Linux系统中,一切皆为文件,而系统运行的载体,是一类特殊的文件,即进程。因此,我尝试从进程的角度分析Linux内核的死机、异常重启等问题。在内核空间,内核本身是一个特权级的进程,它包含一系列系统...

zmjames2000 Just record 275

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

linux查看内存的几个命令

linux查看内存的几个命令基于编解码视频芯片free命令详解top命令详解cat /proc/cmdline命令详解cat /proc/media-mem命令详解 free命令详解 参考[Linux上的free命令详解] top命令详解 参考[Linux top命令小结] cat /proc/cmdline命令详解 / # cat /proc/cmdline mem=144M earlycon console=ttyS0,115200 root=/dev/mtdblock3 rootfstype=squa

a812417530的博客 5201

Linux系统文件、内存、CPU监控与性能调优

启动时,申请的内存空间,在使用一段时间之后,剩余可用的空间越来越少,某次申请的内存空间,大于 剩余可用空间,就内存溢出了。原则:YGC平均时长 *次数 + FGC平均时长*次数 =总gc时间 越小越好。在堆里面的数据,有些会出现,一直存在,无法被GC回收, 越占越多,剩余可用空间,就越来越少。这个命令,当java进程的内存比较大的时候,这个命令,执行时间非常长。判断:打印GC 信息,可以添加打印gc配置参数。新生代 老年代 永久代。

weixin_44786439的博客 389

linux 内存越界判断_linux 内存越界判断

printf("aaa\n");这不是在打印a字符吗?,而且,只有段越界才会引起进程的段错误信号,你访问的地址仍然在进程的合法空间范围内,当然空指针这类地址基本不合法。回复@xxdd:看看gdb进程的infoprocmappings或者去cat/proc/$pid/maps,崩溃指的是程序read,write,execute了一个virtualaddress,这个address不在操作系统给其进程...

weixin_33514864的博客 871

对android虚拟机的理解,包括内存管理机制,垃圾回收机制

与windows内存区别        在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方面,区别于 Windows的内存管理。主要特点是,无论物理内存有多大,Linux都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows是只在需

u013628732的专栏 2184

音视频功能测面试题目

昨天面试了一家美颜相机的功能测试岗位,汇总了下面试中问的一部分内容 1.CPU,内存,帧率怎样测试 2.内存泄露,内存溢出的原因内存泄露:是指程序中间动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用。导致系统运行变慢或应用程序崩溃。OOM即Out Of Memory,一般是由程序编写者对内存使用不当,如对该释放的内存资源没有释放,导致其一直不能被再次使用而使内存被耗...

weixin_34232617的博客 3975

内存问题 分类

C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种纠结的问题。如果crash的地方正是内存使用错误的地方,说明你人品好。如果crash的地方内存明显不是consistent的,或者内存管理信息都已被破坏,并且还是随机出现的,那就比较麻烦了。• use after return:caller访问一个指针,该指针指向callee的栈内内存。• read invalid memory:读取非法内存,本质上也属于内存越界。• wild free:释放内存的参数为非法值。

软件工程小施同学 的专栏 469
上一篇: C语言位域精解
下一篇: Linux内存管理之内核对物理内存的描述
SYP35
博客等级 码龄12年 26粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值