代码之家  ›  专栏  ›  技术社区  ›  Tegra Detra

Java的垃圾收集何时释放内存分配?

  •  14
  • Tegra Detra  · 技术社区  · 15 年前

    我在Java中创建了一个对象,名为FOO。FOO包含大量数据。。我不知道如何处理一个10兆字节的文本文件,我把它拉到ram中进行操作(这只是一个例子)

    这显然是一个巨大的空间,我想从内存中释放它。我将FOO设置为NULL。

    这会自动释放内存中的空间吗? 在自动垃圾回收之前,加载的文本文件占用的内存会一直存在吗?

    6 回复  |  直到 14 年前
        1
  •  15
  •   samitgaur    15 年前

    将任何对象的引用设置为 null ,它变成 可获得的 仍然占据 直到垃圾回收器真正运行为止。关于GC何时运行没有任何保证,除了它肯定会在运行之前运行并从无法访问的对象中回收内存之外 OutOfMemoryException

    您可以调用System.gc()来请求垃圾回收,但这就是请求。由总承包商决定是否运行。

    WeakReference 在某些情况下会有所帮助。看到了吗 this article

        2
  •  8
  •   Thomas Pornin    15 年前

    实际上,这个对象并没有命名为FOO。FOO是不是对象的变量的名称;变量包含 参考 到对象。可能有几个不同的变量包含对同一对象的引用。

    无法到达 对象:这些对象是应用程序无法再使用的对象,因为它无法挽回地忘记了它们在哪里(应用程序可能访问它有引用的任何对象,包括它可以访问的对象中存储在字段中的引用,等等)。

    FOO = null FOO 在该点包含对对象的最后一个可到达的引用,然后释放内存 立即 ,在以下意义上:在 null 设置为

    System.gc() System.gc()

        3
  •  5
  •   Tim Bender    15 年前

    设置 foo = null; 并不意味着 foo 被收集时,其唯一引用的任何对象也将有资格被收集,因此被收集。

        4
  •  5
  •   mhshams    15 年前

    请注意,即使调用System.gc()也不能保证JVM马上就能完成。

        5
  •  0
  •   Truong Ha    15 年前

        6
  •  0
  •   Chathuranga Chandrasekara    15 年前

    或者,您可以考虑一种不将大量数据加载到内存中的方法。如果你能通过改进你的代码来获得这些,那就更好了。