静态方法 loading/unloading 和 java 中的内存区域?

Static methods loading/unloading and memory area in java?

关于 java 中的静态方法,我有四个问题:

1) 当静态方法加载到内存中时? 何时加载 class 或首次调用方法时?

2) 当静态方法从内存中卸载时? 当class 卸载或调用后该方法的执行流程结束时?

3) JVM 静态方法加载到哪个内存区域? 在堆栈内存区域或者 JVM 中有不同类型的内存可用于静态方法(我已经阅读过还有一些静态内存)?

4)我们的应用中有这么多静态方法好不好?

我已经在这个网站和其他网站上回答了很多问题,但他们没有明确说明。

  • 方法只是字节码,所以它在 class 加载时加载,但是 这不是特定于静态方法的 ,成员方法将在同时
  • 卸载class时。但这非常罕见:Unloading classes in java?
  • 类都存储在堆中,在PermGen中space(不是GCed)
  • 视情况而定。如果它是用于语法糖或工厂方法,那很好。如果它是为了实现可以通过无状态和可序列化的对象实现的功能,那很可能也很好。如果是从代码中不应该访问的地方访问某些属性或逻辑,那是错误的。

1) When static methods are loaded in memory? when class loaded or when method get called called first time?

当特定的 class 被 class 加载程序加载时。

2) When static method is unloaded from memory? When class unloaded or when execution flow of that method is ended after call?

当 JVM 垃圾回收加载静态 class 的特定 class 加载器时。

3) In which memory area of JVM static methods are loaded? In stack memory area or there is different kind of memory available in JVM for static methods(I have read about some static memory also)?

通常在 Pergemen space。

where is a static method and a static variable stored in java. In heap or in stack memory

4) Is it good to have so many static methods in our application?

是的,当他们单独解决目的时。

1)静态方法什么时候加载到内存中? class 何时加载或首次调用方法时?

ans) 当 class 加载时

2)静态方法什么时候从内存中卸载? class 卸载时或调用后该方法的执行流程结束时?

ans) 静态方法在 class 被 ClassLoader 加载时被加载,并且在它被 Unloaded 时被移除

3)JVM静态方法加载到哪个内存区?在堆栈内存区域或 JVM 中有不同类型的内存可用于静态方法(我也读过一些静态内存)?

ans)在 Java 虚拟机实例中,有关加载类型的信息存储在称为方法区的内存逻辑区域中。当 Java 虚拟机加载一个类型时,它使用 class 加载程序来定位适当的 class 文件。 class 加载程序读取 class 文件——二进制数据的线性流——并将其传递给虚拟机。虚拟机从二进制数据中提取有关类型的信息,并将该信息存储在方法区中。在 class 中声明的 class(静态)变量的内存也从方法区中获取。

4)在我们的应用中有这么多静态方法好不好?

ans)一个经验法则:问问自己"does it make sense to call this method, even if no Obj has been constructed yet?"如果是这样,它肯定应该是静态的。