我是一名 C++ 程序员,目前正在尝试从事 Java 工作。在 C++ 工作中,我习惯跟踪动态内存分配并采用 RAII 等各种技术来避免内存泄漏。我们知道,Java 提供了垃圾收集器(GC)来处理内存泄漏。因此,在使用 Java 编程时,我们应该放弃对堆内存的所有有益的担忧,而将其留给 GC 来处理内存泄漏,或者应该有一种与没有 GC 的编程语言类似的方法,尝试处理您分配的内存,并让 GC 处理您可能会错过的内存。应该采取什么方法?两者都有什么缺点?

有帮助吗?

解决方案

我不知道你的意思,试图照顾你在GC的存在分配内存的,但我会尝试一些读心术。

基本上,你不应该“担忧”关于你的记忆被收集。如果你没有参考对象了,他们会有所回升。逻辑内存泄漏仍然是可能的,如果你创造一个对象是为你的程序的其余部分引用的情况(例如:注册听众和从未取消注册它们,例如:实现矢量式的集合,不设置项目null时去除关闭结束项目)。

不过,如果你有一个强大RAII的背景,你会被disapointed地了解到,在Java中是没有直接的等价物。该GC是处理内存一流的工具,但没有保证的时候(或者即使)终结器调用。这意味着,所述第一级的处理施加到存储器是应用于任何其它资源,如:窗户,数据库连接,插座,文件,同步原语,等

其他提示

使用Java和.NET(和我想象中,其他大多数GC'ed语言),你不需要担心太多关于在所有堆内存。你的的需要有关,担心的是像文件句柄,插座,GUI原语如字体和等本地资源。这些通常需要“处置”,从而释放本地资源。 (他们经常处理自己在定稿无论如何,但它有点玄乎依傍这一点。你自己处置的东西。)

使用 GC,您必须:

  • 仍然要注意正确释放非内存资源,例如文件句柄和数据库连接。
  • 确保不再保留对不再需要的对象的引用(例如将它们保留在集合中)。因为如果你这样做,就会出现内存泄漏。

除此之外,你 不能 真正“照顾好你分配的内存”,尝试这样做会浪费时间。

从技术上讲,你并不需要担心以后内存分配的清理,因为所有的对象都正确引用计数和GC会照顾一切。在实践中,过度活跃的GC会产生负面影响性能。因此,虽然Java没有一个delete运营商,你放心好了重用对象尽可能多的。

此外Java没有析构函数,因为对象存在会直到GC得到他们,。因此,Java有哪些,你应该使用,以确保当你与他们完成所有非存储相关的资源(文件插座等)关闭的finally结构。不要依赖finalise的方法来为你做这个。

在Java中的GC负责分配存储器并释放未使用的存储器。这并不意味着你可以忽略的问题产品总数。

这对Java GC的FreeS对象不会从根引用。这意味着Java仍然可以有内存泄漏,如果你不小心删除就像在全球包含HashMap缓存来自全球的背景引用等。

如果对象中的任意群集海誓山盟不从根引用参考,在Java GC将释放它们。即这是行不通的引用计数,所以你不需要null所有对象引用(虽然有些编码风格不喜欢作为了他们不需要清除作为组织神经引用。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top