【问题标题】:How free memory after Class.forName call?Class.forName 调用后如何释放内存?
【发布时间】:2013-09-17 13:18:05
【问题描述】:

想要 必须编写一些动态加载类的工具。所以我必须为此调用 Class.forName 函数。可以有很多类 - 大约 10000 个。是否可以在它们全部加载且不需要之后释放内存?

【问题讨论】:

  • 您可以使用不同的类加载器来加载这些类。当您的进程完成时(并且这些类没有任何内存泄漏),GC 将回收这些类,包括类加载器。这是大多数应用程序服务器或 Web 容器所做的。他们加载一个应用程序,当它被取消部署时,它会恢复所有内存。
  • 我会避免创建和加载 10,000 个类。也许你缺少一个抽象,或者可以共享的库,所以它们只加载一次。
  • Unloading classes in java? 的可能重复项
  • 另一个可能的答案:stackoverflow.com/questions/2095974/…
  • 我们真的在谈论 10,000 个不同的课程吗?还是 10,000 个不同的对象或实例?这里有很大的不同。

标签: java class memory garbage-collection classloader


【解决方案1】:

这个问题也许可以做一些澄清。 OP 是加载 Class 实例还是 Class 定义?

如果问题涉及实例,那么正如 Clement Berthou 所说,您需要做的就是取消引用创建的实例,它们应该最终被垃圾收集。您可以随时致电System.gc() 请求垃圾回收。

对于类定义,我认为情况相同,但略有不同。即使该类的所有实例都已被取消引用,可能仍然存在来自最初加载的 ClassLoader 的引用。

因此,我认为您需要取消引用用于加载类定义的 ClassLoader,以使类定义可用于垃圾回收。不过我不确定,上次我直接看类加载是很久以前的事了。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2011-12-10
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多