在java中加载/卸载静态方法和内存区域?

时间:2015-09-12 12:32:32

标签: java memory-management static-methods

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

1)当在内存中加载静态方法时当加载类或第一次调用方法时?

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

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

4)在我们的应用程序中有这么多静态方法是否合适?

我在这个网站和其他网站上经历了很多问题,但他们没有明确指出。

3 个答案:

答案 0 :(得分:4)

  

1)在内存中加载静态方法?加载类时或第一次调用方法时调用?

当类加载器加载该特定类时。

  

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

当JVM垃圾收集到那个加载静态类的特定类加载器时。

  

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

通常在Pergemen空间。

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

  

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

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

答案 1 :(得分:2)

  • 一个方法只是字节码,所以在加载类时会加载它,但这不是静态方法特有的,会同时加载一个成员方法
  • 卸载课程时。但这非常罕见:Unloading classes in java?
  • 类存储在堆中,PermGen空间(不是GCed)
  • 这取决于。如果用于语法糖或工厂方法那就没问题。如果它是用于实现无状态和可序列化对象可以实现的功能,那么这很可能也很好。如果要从代码中无法做到的地方获取某些属性或逻辑,那就错了。

答案 2 :(得分:1)

1)在内存中加载静态方法?加载类时或第一次调用方法时调用?

ans)加载课程时

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

ans)当ClassLoader加载类时会加载静态方法,卸载时会删除静态方法

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

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

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

ans)一条经验法则:问问自己“即使没有构建Obj,这个方法也有意义吗?”如果是这样,那肯定是静态的。