【问题标题】:How JVM manages memory for methods?JVM 如何管理方法的内存?
【发布时间】:2023-10-31 10:49:02
【问题描述】:

例如,我们有一个 MyClass 的实例,它包含 1 个方法。此方法应保存在内存中。当MyClass 的这个实例被 GC'ed 时,对这个方法的引用是否也被删除了?我想弄清楚天气通过依赖注入做所有事情(因此为每个类创建新实例)需要更少的内存和更高效或更简单的 Helper 带有一堆静态方法的类仍然很好。

【问题讨论】:

  • 依赖注入不会使应用程序使用更多或更少的内存,因此节省内存不是使用 DI 的好理由。
  • 方法代码保存在类中,而不是实例中。
  • @Jesper,我非常了解,但我只是对此争论不休,老实说,我只是想要一些东西来证明我的观点。

标签: java memory memory-management static jvm


【解决方案1】:

对象的实例方法存储在它的类对象中(应该只存在一个副本),它们不会与每个新实例一起“复制”,相反,每个实例都包含对驻留在其中的方法实现的引用类对象。 实例是垃圾收集而不是类数据。根据 java 版本,类数据存储在 permgen 空间或元空间中。 垃圾收集器专门在创建实例的堆上工作,而不是在 permgen 或元空间上。

【讨论】:

  • 在底层每个实例都持有对类的引用,又持有对其所有方法的引用。
  • @MarquisofLorne 所以,有一个元空间保存对所有方法的引用,并且是否存在包含某些方法的类的实例并不重要,对吧?那么,如果你没有类的实例,最好使用静态方法?
  • @VictorK。静态方法也存储在元空间中,但静态方法不能使用实例变量,因此您不能将所有方法设为静态,因为它们将无法利用实例数据。但是,如果您只想访问方法中的静态数据,则方法本身必须是静态的。