我在一本Java教科书(SL-275)中读到了这篇文章。
当系统上没有需要分配的内存时,不去分配内存的程序最终会崩溃。这些程序据说有内存泄漏。
为什么没有记忆了?系统通常有几百兆字节的内存,变量需要2-8字节的数据.假设我们有1000个未销毁的变量,即只有8KB。那么为什么垃圾收集那么重要呢?
我试着在网上搜索答案,甚至联系了我的讲师,但没有找到满意的答案。
发布于 2012-09-15 16:12:18
如果程序使用完变量后,系统无法回收内存,则这是内存泄漏。
这很重要因为
真实的战争故事:我曾经调试过一个ASP .NET系统,该系统内存泄漏很小(我认为每个请求对特定网页的大小大约是60字节)。但是这个页面经常被点击,我们不得不每小时回收应用程序池,以避免耗尽服务器上的RAM。这是在一个非常详细的服务器上。它还表明,在垃圾收集环境中甚至可能发生泄漏--我们应该始终注意内存消耗。
发布于 2012-09-15 16:13:15
变量可能只包含一两个单词的数据,但对于类型为某些Java对象的变量,该单词实际上是一个指向垃圾收集数据的指针,即对象的状态。然后,该对象状态可能包含指向其他对象(或它们的数组)的指针,它们本身指向其他对象,或指向以前的对象(循环引用!)等。
垃圾收集器只在确保没有(来自局部变量或全局变量的)引用链指向它之后才释放(即让JVM重用)内存。
我强烈建议至少仔细阅读垃圾收集上的维基百科页面,然后如果可能的话,阅读一本像垃圾收集手册这样的教科书。你也可以阅读保罗威尔逊1992年的GC调查文章。
您应该关心RAM的使用;从应用程序的角度来看,访问硬盘需要很长的时间(访问磁盘上的一个is块大约是10毫秒)。在RAM上访问它是几微秒,比以前快一千倍;片上缓存可以在纳米秒内访问。)SSD会让情况更好一些。
发布于 2012-09-15 16:13:26
首先,假设所有变量都是2到8个字节,这是一个很大的假设。有些可能是相当大的数据结构,在某些应用程序中可以很好地达到兆字节。
其次,如果一个循环运行数百万或数十亿次,即使是2字节变量泄漏也会造成严重破坏,特别是在一个长期存在的程序中。
第三,物理内存的数量可能与进程地址空间无关。例如,一个32位的进程可能只能处理4G,而不管你的机器有几百of。
最后,即使您能够处理泄漏,更好的编码风格是没有这些潜在的错误。其他任何事情都是草率的:-)
https://stackoverflow.com/questions/12438957
复制相似问题