代码之家  ›  专栏  ›  技术社区  ›  Alok Save

动态内存处理Java VS C++

  •  2
  • Alok Save  · 技术社区  · 16 年前

    我是一个C++程序员,目前正在尝试使用Java。在C++上,我有跟踪动态内存分配和使用RAIE等各种技术来避免内存泄漏的习惯。Java,我们知道提供了一个垃圾收集器(GC)来处理内存泄漏。因此,在Java编程时,人们应该放弃堆内存的所有健康担忧,并将其留给GC来处理内存泄漏,或者如果有一种类似于没有GC的编程语言的方法,那么就要照顾好你的内存。吃了,让GC来处理那些你可能会错过的。这种方法应该是什么?这两者都有什么坏处?

    5 回复  |  直到 16 年前
        1
  •  5
  •   André Caron    16 年前

    我不确定您试图在GC存在的情况下处理您分配的内存是什么意思,但我将尝试一些读心术。

    基本上,你不应该“担心”你的记忆被收集。如果您不再引用对象,它们将被拾取。如果您创建了一种情况,在这种情况下,对象将被引用到程序的其余部分(例如:注册侦听器,而从不取消注册它们,例如:实现一个类似向量的集合,该集合不将项设置为 null 从末端移除物品时)。

    然而,如果你有一个强大的RAII背景,你会失望地得知,在爪哇没有直接等价物。GC是处理内存的一流工具,但不能保证何时(甚至何时)调用终结器。这意味着应用于记忆的一流治疗是 不 应用于任何其他资源,如:Windows、数据库连接、套接字、文件、同步原语等。

        2
  •  5
  •   cHao    16 年前

    用Java和.NET(我想,大多数其他的GC'ED语言),你根本不需要担心堆内存。你什么 做 需要担心的是,本地资源,如文件句柄、套接字、图形用户界面原语,如字体等。这些资源通常需要“释放”,释放本地资源。(不管怎么说,他们通常在最后定稿时就把自己处理掉,但要回到这一点上有点困难。自己处理东西。)

        3
  •  2
  •   Michael Borgwardt    16 年前

    使用GC,您必须:

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

    除此之外,你 不能 真的“注意你分配的内存”,试图这样做是浪费时间。

        4
  •  2
  •   doron    16 年前

    从技术上讲,您不必担心在内存分配后清理,因为所有对象都被正确地引用计数,并且GC将处理所有事情。实际上,过度活跃的GC会对性能产生负面影响。因此,Java没有 delete 运算符,您最好尽可能多地重用对象。

    此外,Java没有析构函数,因为对象将存在直到GC到达它们为止。因此Java具有 finally 构造您应该使用的资源,以确保当您使用完所有与内存无关的资源(文件套接字等)时都将关闭。不要依赖 finalise 方法为您执行此操作。

        5
  •  1
  •   rsp    16 年前

    在Java中,GC负责分配内存并释放未使用的内存。这并不意味着你可以一起忽视这个问题。

    Java GC释放未从根引用的对象。这意味着如果您不小心从全局上下文中删除引用,比如全局哈希映射中的缓存等,Java仍然可能存在内存泄漏。

    如果没有引用任何其他对象的簇,则Java GC将释放它们。也就是说,它不适用于参考计数,因此您不需要 null 所有对象引用(尽管有些编码样式更喜欢将引用作为sonn清除,因为它们不再需要了。)

    推荐文章