当我们使用 new 运算符创建一个对象时,它是否使用实际的 .class 文件在 java 中创建一个对象
When we create an object using new operator, does it use the actual .class file to create an object in java
我对某个主题感到困惑,无法在网上找到它。
据我了解,当程序启动时,class 加载器加载 .class
文件并将它们作为类型为 Class
.
的对象存储在内存中
我的问题是我们何时使用:
Test test = new Test();
新对象是使用.class
文件创建的,还是使用内存中已经存在的Class
对象?
一旦 class 被加载到 JVM 中,相同的 class 将不会被相同的 class 加载程序再次加载。新实例将从内存中的 class 对象创建(对于相同的 class 加载程序)。
高级步骤(从https://www.ibm.com/developerworks/java/tutorials/j-classloader/j-classloader.html复制)
- 调用 findLoadedClass 查看是否已经加载 class.
- 如果尚未加载 class,请使用 findClass 获取字节(被 class 加载程序实现覆盖)。
- 如果找到原始字节,调用 defineClass 将它们变成一个 Class 对象。 (AppClassLoader 中的示例)
- 如果 class 已解析,调用 resolveClass 来解析 Class 对象。
如果仍然没有 class,抛出 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
A class (.class) 被加载到 方法区域 (每个 JVM 1 个)。这也是堆的逻辑部分。
因此,在您的情况下,当通过 main 方法或其他一些 class 加载时,Test.class 将作为以下结构中的依赖项出现在方法区中:
Method Area 存储每次加载的以下数据 class :
- 运行-时间常数池
- 字段和方法数据
- 方法和构造函数代码
当遇到 new Test()
时,将在堆中创建一个新的测试实例 class,代表一个测试类型的对象。
Where does class, object, reference variable get stored in java. IN heap or stack? Where is heap or stack located?
上面post把JVM中的存储原理解释的比较清楚
我对某个主题感到困惑,无法在网上找到它。
据我了解,当程序启动时,class 加载器加载 .class
文件并将它们作为类型为 Class
.
我的问题是我们何时使用:
Test test = new Test();
新对象是使用.class
文件创建的,还是使用内存中已经存在的Class
对象?
一旦 class 被加载到 JVM 中,相同的 class 将不会被相同的 class 加载程序再次加载。新实例将从内存中的 class 对象创建(对于相同的 class 加载程序)。
高级步骤(从https://www.ibm.com/developerworks/java/tutorials/j-classloader/j-classloader.html复制)
- 调用 findLoadedClass 查看是否已经加载 class.
- 如果尚未加载 class,请使用 findClass 获取字节(被 class 加载程序实现覆盖)。
- 如果找到原始字节,调用 defineClass 将它们变成一个 Class 对象。 (AppClassLoader 中的示例)
- 如果 class 已解析,调用 resolveClass 来解析 Class 对象。
如果仍然没有 class,抛出 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
A class (.class) 被加载到 方法区域 (每个 JVM 1 个)。这也是堆的逻辑部分。
因此,在您的情况下,当通过 main 方法或其他一些 class 加载时,Test.class 将作为以下结构中的依赖项出现在方法区中:
Method Area 存储每次加载的以下数据 class :
- 运行-时间常数池
- 字段和方法数据
- 方法和构造函数代码
当遇到 new Test()
时,将在堆中创建一个新的测试实例 class,代表一个测试类型的对象。
Where does class, object, reference variable get stored in java. IN heap or stack? Where is heap or stack located?
上面post把JVM中的存储原理解释的比较清楚