java中的内存管理利用率

时间:2013-05-13 11:44:26

标签: java memory-management

我有一个简单的查询。基本上它是一个理论问题。我需要清除这个想法。我没有找到任何合适的答案。问题很简单。假设我们有一个名为A的类

class A{
    ......
}

现在从我的主要功能我创建一个A的对象。

A obj = new A();

现在在创建对象之后,我将能够访问类中存在的任何方法,变量。

但是对于静态方法或变量,我们可以通过使用像

这样的类名来直接实现这一点
A.methodname();

现在我的问题是,如果我们正在创建任何类的一个对象,那么将为此分配内存。现在,如果我们使用静态方法直接通过类名调用它们,那么我们不创建任何对象,所以在这种情况下内存不应该分配。但是没有分配内存我们如何访问方法或任何变量名?使用引用还需要一些内存分配。请解释在这种情况下如何发生内存分配或如何访问方法或变量在课堂上。

6 个答案:

答案 0 :(得分:2)

  

现在如果我们使用静态方法直接通过类名调用它们,那么我们就不会创建任何对象,因此在这种情况下不应该分配内存。

实际上,你做到了。它依赖于JVM,但HotSpot JVM为所有静态字段创建一个特殊对象。您可以在堆转储中看到此对象。

使这个对象更容易让GC跟踪正在使用的对象。卸载ClassLoader时,将丢弃此类对象。

答案 1 :(得分:1)

这是通过类加载完成的。

我们没有任何对象实例,但是我们将 类代码 加载到内存中,所以实际上有内存分配。

答案 2 :(得分:1)

静态函数只能访问静态变量,并且已经分配了内存。

答案 3 :(得分:1)

当加载类时,JVM会分配静态成员(方法和变量)。

没有分配内存我们如何访问方法或任何变量名?

您无法从静态方法访问实例方法或变量。如果你试试,它不会编译。

从静态方法中,您只能访问其他静态方法或静态变量(在类加载时分配)。

答案 4 :(得分:0)

类的所有静态变量在类加载时被加载到内存中,因为每次创建该类的新对象时,实例变量都会分配内存。

但是,静态变量值不是特定于对象的实例,而是由类的所有对象共享,其中实例变量值特定于实例(类对象)。

这就是你可以使用类名访问静态变量的原因,因为它们已经加载到内存中,因为实例变量和方法需要创建对象来访问它们。

干杯!

答案 5 :(得分:0)

对于类加载期间的静态,内存分配是在永久生成中完成的。它只进行一次初始化。它与类而不是对象有关。