我今天有点感冒了,头昏昏沉沉,写完这篇睡觉去。
我也无法解释Robbin的机子为什么会出现那种情况,如果有人Linux功力够,可以架起Kernel Debugger, 一直追踪到底。当然得有时间,还得配置一样的机子。我的Linux功力实在不够,无法再探讨下去了。平时也就用用Windows,刚刚开始用FreeBSD。Windows Kernel Debugger还架设的起来,Linux内核跟踪就无能为力。
关于操作系统释放内存的事再说两句。操作系统在创建进程的时候会给那个用户进程生成一个4G的虚拟进程专用空间,用户进程自己代码只能直接读写操作这虚拟4G内存。进程结束(不管是自己结束还是被强制结束)时,操作系统把这4G的虚拟进程收回去。所有现代主流操作系统,Windows NT/2k/XP/2003/Vista, Linux, BSD, Mac OS X都是如此。为了求证,我翻了四本书:
The Design and Implementation of the 4.4 BSD Operating System,
Operating Systems concepts and design,2nd edition
The Logical Design of Operating Systems,2nd edition
Operating System Concepts, 5th edition
里面都是这么说的,还不算我以前引的Jeffrey Richter的那本,这几本书都在我案头上,够权威态度够严谨了吧。还怀疑的话推荐学习Minix操作系统,Operating Systems: design and implementation一书非常好。
前面有人扯到linux会对进程打开过的文件做cache,用以证明进程在退出之后,占用的内存仍然没有释放。
这完全是两码事。文件系统cache又不在这4G的虚拟进程专用空间里。文件系统是内核的一部分,自己对最近用的文件cache一下是为了优化。(windows的NTFS一样会cache)
用户进程在x86上只能在Ring 3级别跑,想读写文件或访问网络只能通过System Call来做. 这些System Call(Linux里面有200来个),可都是在Ring 0级别跑的,在Ring 0里面那可是个自由的天地,什么进程,内存保护的限制都没有,代码爱干什么干什么。
不是所有在Ring 0里跑的代码,都是Linux内核团队写的。IO的驱动程序都是在内核跑的,但不少是别人写的。这些代码要是遗漏内存,系统会崩溃。
内存遗漏和OutOfMemory还是两码事。一段代码,成功的申请了1k的内存,然后没有释放,这段代码遗漏内存,但是内存申请成功了。一段代码,向系统申请内存,系统无法分配内存,这才是OutOfMemory。我以前用Java写过一个Web Application,在Tomcat下跑,里面file upload的码是自己写的,在内存里生成个同样大的ByteArray,没有检查文件大小,结果有个人上载300MB的文件,JVM申请那么大的内存块失败,在Jsp页上直接打出了Stack Trace.但是Tomcat还是跑的好好的,操作系统(Linux)还是跑的好好的.那个
JVM占用的内存高达1.7G,好好的又跑了一个月,直到系统更新。
但是我写一个小小的程序,里面要有个函数遗漏内存,如果这个函数只呼叫一次,那么一点不影响使用。但是在VC debug下调试,退出时debugger还是会告诉你内存遗漏.
OutOfMemory,可能是程序内存遗漏而产生的恶果,但也可能不是,就像我写的那个苯苯的程序,虽然OutOfMemory,但不遗漏内存。
内存遗漏的代码,如果是小程序偶尔跑一次,影响不大,如果是服务器天天跑,倒最后也就会屡屡申请内存,操作系统不停的说No,别的事就耽误了,如果是跑在Ring 0里,最终会Kernel Panic。所以内存泄漏还是存在的,在不同的地方后果不一样。
robbin 写道
因为推荐我使用SuSE9 SP3 x86_64的Unix专家已经在无数大型系统,甚至一些你们想像不到的巨大负载的系统上面部署和稳定运行这个版本的kernel了。
我一点不否认Linux的负载能力和稳定性,但是这不能证明那台机子上在内核里跑的代码(包括Linux内核及第三方驱动程序),全部没有错。Linux内核的代码if,else,for嵌套一大堆,没准在那台机子特定的条件下,激活的代码就有Bug。
Linux的netfilter,可是在Ring 0里面跑的,看看这个帖子,Linux Kernel Team的人是怎么说的:
Re: [PATCH] fix mem-leak in netfilter
这个源代码可以在这里找到:
http://www.promethos.org/lxr/http/source/net/ipv4/netfilter/ipt_recent.c
看里面逻辑套的,得算是bad smell了吧。
robbin 写道
再说一个现象,根据我当时对memory leak的观察,用户进程使用的resident内存并没有增加很稳定,系统buffer,disk cache也没有增加很稳定,但是用户进程持续不断向kernel申请更多的内存,却从来没有向kernel回吐内存。这就好像一个人拼命喝酒,但是他的肚子就像一个无底洞那种感觉。
用户进程向kernel申请更多的内存,如果申请成功了,使用的resident内存却没有很稳定增加,这是不是很矛盾啊。
用户进程想读写文件或访问网络只能通过System Call,内核里面的代码会跑一圈,这里面要是内存遗漏外面是看不出来的。
要想再追根问底,我看只能搭个kernel debugger追踪一下。不然就成悬案了,就像我们现在也不知道肯尼迪是谁杀的。
分享到:
相关推荐
逆向工程是一种技术手段,它允许安全专家将已编译的代码还原成可读的高级语言,以便分析程序的功能和行为。在面对杂项恶意软件时,逆向工程可以帮助揭示隐藏的恶意代码、感染机制、传播途径以及数据窃取或破坏的手段...
【标题】Transportali.re是一个专注于搬家、包裹运输和货运服务的在线平台,它提供了一个集中的项目组合来处理各种运输申请。这个平台可能是为个人、小型企业或物流公司设计的,旨在简化物流流程,提高效率。 ...
RE2的正则表达式语言几乎是RegExp提供的功能的超集(请参见 ),但是它缺少两个功能:向后引用和预言断言。 请参阅下面的更多细节。 RE2对象模仿标准RegExp使其在大多数情况下可作为RegExp替代产品。 RE2被扩展为...
Go语言以其并发性能优秀、语法简洁和丰富的库支持,已经成为构建高效数据库系统的一种首选语言。本文将深入探讨一个基于Go语言开发的,利用DRH(Deep-Re-Hash)深度哈希分区算法的高性能Key-Value嵌入式数据库。 ...
总结来说,ReClass.NET 是一个强大的游戏和模拟器内存分析工具,它提供了对程序内存的深入洞察,适用于游戏开发者、安全研究员和逆向工程爱好者。项目源代码的组织结构显示了良好的工程实践,包括版本控制、自动构建...
- **加强安全性**:确保遗留系统的安全性,防止数据泄露和其他安全风险。 通过以上知识点的详细解释,我们可以看到《重新设计遗留软件》这本书旨在提供一种全面的方法来解决遗留软件问题,不仅关注于代码级别的...
在项目中引入Reres,可以通过JavaScript代码进行初始化和调用。 总之,Reres是开发过程中提高效率的好帮手,它简化了本地文件的替换流程,让开发者能够更加专注地编写代码,而不用频繁地手动刷新页面。了解并掌握Re...
**正文** ...对于需要在C++项目中使用正则表达式,并重视性能和安全性的开发者来说,RE2是一个理想的工具。通过深入理解自动机理论和RE2的API,开发者可以充分利用这个库来提升其应用程序的功能和效率。
此框架基于Python编程语言,依赖的库包括hashlib、socket、urllib2、urlparse、re、uuid、redis和requests,运行环境需确保Python 2.x版本,并配置好Redis缓存框架,监听6379端口。 该安全框架的核心功能包括: 1....
【标签】"Python" 确认了这个项目的核心编程语言是Python,这是一种高级、解释型、交互式和面向对象的脚本语言。Python因其简洁的语法和丰富的库支持,常被用于数据科学、Web开发、自动化任务、网络编程等领域。在R3...
本项目“Python-基于Python实现的Linux后台日志监控小项目”提供了一个用Python语言编写的工具,用于实现这一功能。下面我们将详细探讨该项目的核心知识点。 1. **Python编程基础**:项目的基础是Python编程,因此...
1. **Python编程**:作为项目的编程语言,Python以其简洁明了的语法和丰富的库支持,被广泛用于数据分析、网络爬虫以及Web开发等领域。在这个项目中,Python扮演了核心角色。 2. **异步爬虫**:项目使用异步方式...
总的来说,理解和运用好这个跨语言的敏感词库,可以帮助开发者有效地实现在各种应用场景下的内容过滤,提升系统的信息安全性和合规性。在实际应用中,还需要考虑如何更新和维护词库,以适应不断变化的敏感词汇环境。
Rust 的 regex 库以其高效和安全著称,而 Go 语言则以其简洁的语法和良好的并发性能受到开发者喜爱。该项目的出现,使得 Go 开发者能够利用 Rust 正则引擎的性能优势,同时保持在 Go 语言中的编程体验。 2. **设计...
这个项目使用了TypeScript作为主要的编程语言,这是一个强类型的JavaScript超集,提供更好的类型安全性和开发效率。接下来,我们将深入探讨TypeScript在构建此类应用中的重要性以及它如何塑造一个更高效、更可靠的...
它不仅支持多种常见的Web开发语言,还能够显著提高工作效率,确保数据一致性,从而成为软件开发和维护过程中的得力助手。当然,在使用这类工具时也需要注意安全性问题,确保软件来源可靠,避免引入潜在的安全风险。
- **错误处理**:如果遇到问题,如POM文件报错,通常通过刷新项目(Reimport)或更新依赖来解决。 3. **数据库连接**: - **数据库驱动**:确保IDEA项目中包含了正确的数据库驱动库,例如对于MySQL,需要mysql-...
《GJB 2115-1994 军用软件项目...总的来说,《GJB 2115-1994 军用软件项目管理规程》为军用软件项目的管理提供了全面而细致的指导,旨在提升软件开发的效率、质量和安全性,确保软件能够满足国防和军队建设的特殊需求。
本项目提供了一个用Python实现的爬虫和推送程序,旨在帮助用户便捷地获取每日的安全信息更新。以下是关于这个项目的详细知识点: 1. **Python编程语言**: Python是广泛应用于Web开发、数据分析、机器学习等领域的...
Haskell是一种纯函数式编程语言,强调不可变性、类型安全和高阶函数。在这个项目中,开发者可能会利用Haskell的这些特性,比如使用高阶函数如`map`或`zipWith`来处理字符串,以及利用类型系统确保输入和输出的正确性...