首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内存泄漏的概念

内存泄漏的概念
EN

Stack Overflow用户
提问于 2012-09-15 16:08:32
回答 4查看 238关注 0票数 0

我在一本Java教科书(SL-275)中读到了这篇文章。

当系统上没有需要分配的内存时,不去分配内存的程序最终会崩溃。这些程序据说有内存泄漏。

为什么没有记忆了?系统通常有几百兆字节的内存,变量需要2-8字节的数据.假设我们有1000个未销毁的变量,即只有8KB。那么为什么垃圾收集那么重要呢?

我试着在网上搜索答案,甚至联系了我的讲师,但没有找到满意的答案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-15 16:12:18

如果程序使用完变量后,系统无法回收内存,则这是内存泄漏。

这很重要因为

  1. 你可能会说8个字节是一点点数据。但是,如果这8个字节在一个紧密的循环中泄漏,每分钟运行数百万次呢?你很快就会耗尽记忆。
  2. 较大的数据结构非常常见。例如:一个网络刮板可能泄露HTML文档的表示,很容易地泄露100的kB,甚至是兆字节。
  3. 虽然内存很便宜,但100兆字节的内存仍然不常见。您可能会想到磁盘空间,而磁盘空间则比较慢。当您耗尽了RAM,并且系统需要在磁盘和RAM之间交换内存来执行最简单的操作时,性能将在极端情况下下降。
  4. 还可以考虑移动设备或嵌入式设备,它们的内存非常有限。

真实的战争故事:我曾经调试过一个ASP .NET系统,该系统内存泄漏很小(我认为每个请求对特定网页的大小大约是60字节)。但是这个页面经常被点击,我们不得不每小时回收应用程序池,以避免耗尽服务器上的RAM。这是在一个非常详细的服务器上。它还表明,在垃圾收集环境中甚至可能发生泄漏--我们应该始终注意内存消耗。

票数 1
EN

Stack Overflow用户

发布于 2012-09-15 16:13:15

变量可能只包含一两个单词的数据,但对于类型为某些Java对象的变量,该单词实际上是一个指向垃圾收集数据的指针,即对象的状态。然后,该对象状态可能包含指向其他对象(或它们的数组)的指针,它们本身指向其他对象,或指向以前的对象(循环引用!)等。

垃圾收集器只在确保没有(来自局部变量或全局变量的)引用链指向它之后才释放(即让JVM重用)内存。

我强烈建议至少仔细阅读垃圾收集上的维基百科页面,然后如果可能的话,阅读一本像垃圾收集手册这样的教科书。你也可以阅读保罗威尔逊1992年的GC调查文章。

您应该关心RAM的使用;从应用程序的角度来看,访问硬盘需要很长的时间(访问磁盘上的一个is块大约是10毫秒)。在RAM上访问它是几微秒,比以前快一千倍;片上缓存可以在纳米秒内访问。)SSD会让情况更好一些。

票数 0
EN

Stack Overflow用户

发布于 2012-09-15 16:13:26

首先,假设所有变量都是2到8个字节,这是一个很大的假设。有些可能是相当大的数据结构,在某些应用程序中可以很好地达到兆字节。

其次,如果一个循环运行数百万或数十亿次,即使是2字节变量泄漏也会造成严重破坏,特别是在一个长期存在的程序中。

第三,物理内存的数量可能与进程地址空间无关。例如,一个32位的进程可能只能处理4G,而不管你的机器有几百of。

最后,即使您能够处理泄漏,更好的编码风格是没有这些潜在的错误。其他任何事情都是草率的:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12438957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档