其他内存相关知识——Linux内存管理小结三
【Overcommit和OOM】
在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,说明当前系统没有足够的可用内存。一般程序都会判断malloc返回值是null时便报错退出。
在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,说明当前系统没有足够的可用内存。一般程序都会判断malloc返回值是null时便报错退出。
最近在生产环境遇到一个奇怪的现象,nginx占用的虚拟内存和物理内存都很高,并且一直不会下降。
因为服务器本身的业务量并不大,而且对比集群其他服务器nginx才几十兆的内存消耗,第一个想到的就是内存泄漏。但是连续观察了多天,内存也没有进一步上涨,和以前遇过的内存泄漏问题不是很像。
提到内存,我们会想到经常接触的三个词:虚拟内存、物理内存、共享内存。它们分别对应top输出中的VIRT、RES、SHR三列。
系统的物理内存被划分为许多相同大小的部分,也称作内存页。内存页的大小取决于CPU的架构和操作系统的配置,一般为4KB。物理内存的使用主要分为以下几方面:
在之前的博客中提到过,valgrind可以用来检测内存泄露,但在使用中,往往会遇到一些问题,给调试工作带来很多不必要的麻烦,我自己遇到的有以下两种:
(1)内存泄露误检(系统初始化时,可能有一些需要长期保存在内存中的数据结构,这些空间是永远不释放的,而这些内存会被认为绝对泄露)
(2) valgrind检查内存泄露过于全面,运行后的结果太多往往很难从中找到有用的信息。有时候,我们只需要关注某些函数,可能在执行某个操作,调用某些函数时会出现内存泄露,此时,valgrind的工作显得冗余而复杂
C运行时库函数 C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的。
API函数 API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的。
发现现在几乎所有的网站都对url中的汉字和特殊的字符,进行了urlencode操作,也就是:
http://hi.baidu.com/%BE%B2%D0%C4%C0%CF%C8%CB/creat/blog/
这个样子,中间%形式的,肯定就是我的登录用户名称了吧。
先跑起来调试手段使用顺手的工具情景分析利用好测试用例厘清核心数据结构之间的关系整体和细节多问自己几个问题写自己的代码阅读笔记总结
我在本文的基础上做了一些补充和改进,见《如何阅读一份源代码?(2020年版)》
阅读源代码的能力算是程序员的一种底层基础能力之一,这个能力之所以重要,原因在于:
然而,读代码比写代码还是更难一些,原因在于“写代码是在表达自己,读代码是在理解别人”。因为面对的项目多,项目的作者有各自的风格,理解起来需要花费不少的精力。
本文选自“字节跳动基础架构实践”系列文章。
“字节跳动基础架构实践”系列文章是由字节跳动基础架构部门各技术团队及专家倾力打造的技术干货内容,和大家分享团队在基础架构发展和演进过程中的实践经验与教训,与各位技术同学一起交流成长。