如果您拥有64位操作系统,则您的地址空间几乎无限制。所以我的问题是,在这样的系统中,释放内存的重要性是多少?即使你有4 GB的有限内存,在需求分页方案中(只有在触摸时才会引入内存),与释放内存相比,你会得到的开销很小,我想是一些额外的页面交换,因为内存你会长时间不碰,会自动换掉。我在这里错过了什么吗?或者我的论点有效吗?
实际上,如果它没有大的性能影响,那么我认为这对C / C ++程序员来说是件好事,因为内存泄漏不再是一个重要的问题需要处理!
答案 0 :(得分:11)
开销...是一些额外的页面交换...因为内存...将自动交换
自动换到哪里?以太?页面文件是有限的,它们存在的存储也是如此。
你认为永远不要在长期运行的服务应用程序中释放内存是一个好主意吗?
答案 1 :(得分:3)
我认为这里的关键词是“虚拟的” - 其定义归结为“实际上并非如此”。事实上,你的内存空间不是无限的。所有这些都随着内存的不断增长而发生了变化,这是应用程序的范围,您可以随心所欲地对内存管理充满信心。
换句话说,如果你正在写“Hello World”,那么你可以把你的记忆留在原地。这些天,你可能可能逃脱一个没有管理自己内存的小应用程序。但是如果你编写一个设备驱动程序或服务守护程序,只要操作系统运行就可以运行......好吧,我不想每周一次关闭生产机器来手动清理别人的内存泄漏。
答案 2 :(得分:2)
清理以前分配的内存不仅仅是最佳做法。
如果由于性能原因所有程序都停止释放内存块,您将看到会发生什么。
是的,这很重要。
答案 3 :(得分:2)
这取决于应用程序。一些应用程序正在分配大量(例如,每秒几百兆字节)。如果你认为你永远不会释放它,但使用交换空间,你将在几个小时内完成一个数千兆字节的交换。
查看有关垃圾收集的大量文献,例如the garbage collection handbook开始。
旧安德鲁·阿佩尔的论文garbage collection can be faster than stack allocation应该给你有趣的见解。
但是,您可以考虑垃圾收集器泄漏一点,然后泄漏率仅为每分钟几兆字节(GC之后),情况也不同。
当你只考虑短期应用程序时,内存泄漏确实不那么重要。但是只要你拥有持久的服务器进程,就应该关心内存,永远不要释放(或重用)它是一个坏主意。
答案 4 :(得分:2)
是的,它对于生命周期较短的工具很有意义,例如命令行实用程序,如ls
。
例如,Busybox甚至有一个配置选项,可以像往常一样控制free
内存,还是让OS在退出时自动清理它。
<强>
FEATURE_CLEAN_UP
强>作为大小优化,busybox通常不会显式退出 释放动态分配的内存或关闭文件。这节省了 因为操作系统将为我们清理空间,但它可能会混淆调试器 像valgrind,它报告了大量的内存和资源泄漏。
除非您有充分的理由清理,否则请勿启用此功能 事情手动。
答案 5 :(得分:2)
地址空间似乎实际上是无限的,但任何当前计算机上的物理存储肯定不是。操作系统(任何操作系统,不仅仅是Linux)都无法知道应用程序是使用内存页面完成的,除非它被明确释放。交换页面仍然需要磁盘空间和CPU + I / O时间来处理。
根据我的经验,即使在极少数情况下,一些温文尔雅的营销人员设法销售超出要求的计算机系统,可用内存仍然在一段时间后成为问题。
此外,如果您想知道如果应用程序停止释放内存会发生什么,只需查看一个只是泄漏/过度使用内存的应用程序,而不是完全拒绝释放它。例如,经过几个小时的标签密集型活动后,Firefox很快将在我的8GB系统上升至3GB以上。我甚至不想想在没有任何记忆被释放的情况下这个数字有多高。
现在想象一下,哦,十个应用程序同时做同样的事情 - 我一个人,我的桌面系统上没有30GB的物理或虚拟内存。如果我的系统已经只使用一个Firefox实例进行了抨击,我担心在您提出的方案中会发生什么......
答案 6 :(得分:1)
如果您认为在free()
内存崩溃时可能发生的最糟糕的事情是崩溃,您应该考虑在以下情况下会发生什么:
底线是,释放你分配的内存。它会拯救你的理智。
答案 7 :(得分:0)
如果您有64位操作系统,则虚拟地址空间 无限大小
您似乎错过的部分是virtual
部分。
首先,你总是被你拥有的实际RAM“限制”。
我的意思是限制如下:
在4GB的例子中,你提到,如果没有进程释放内存并继续请求新内存,操作系统将开始使用HD来交换虚拟页面。
如果所有正在运行的进程都发生这种情况,那么您将遇到页面错误并访问HD,从而导致进程和整个系统的性能负担过重(遵循您认为合适的方法)。
结果,为了使用户拥有“可用”系统,他将不得不购买越来越多的RAM
如果你说,你认为用户会如何反应,你的系统没有响应,但你只需购买更多的RAM,例如16GB或32GB或.....