我对某个主题感到困惑,无法在网上找到它。
据我了解,当程序启动时,类加载器加载.class
文件并将它们作为Class
类型的对象存储在内存中。
我的问题是我们何时使用:
Test test = new Test();
是使用.class
文件创建新对象,还是使用内存中已有的Class
对象?
答案 0 :(得分:5)
将类加载到JVM后,不会再为同一个类加载器加载相同的类。将从内存中的类对象创建新实例(对于相同的类加载器)。
高级别的步骤(从https://www.ibm.com/developerworks/java/tutorials/j-classloader/j-classloader.html复制)
如果仍然没有类,则抛出ClassNotFoundException。
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
以下所有示例将打印相同的hashCode并引用相同的Test.class
Test test1 = new Test();
Test test2 = new Test();
System.out.println(test2.getClass().hashCode());
System.out.println(test1.getClass().hashCode());
System.out.println(Test.class.hashCode());
了解更多详情 http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html?page=1
答案 1 :(得分:1)
将一个类(.class)加载到方法区域(每个JVM 1个)。这也是堆的逻辑部分。
因此,在您的情况下,当通过main方法或其他类作为依赖项加载时,Test.class将出现在方法区域中:
方法区域为每个加载的类存储以下数据:
遇到new Test()
时,将在堆中创建一个Test类的新实例,该实例表示Test类型的Object。
上面的帖子更清楚地解释了JVM中的存储原理。