假设我有以下课程:
class Caller {
public void createSomething() {
new Something();
}
}
将执行此行:
static void main() {
Class<?> clazz = Caller.class;
}
导致JVM加载类,Something
还是将类加载推迟到createSomething()
调用该方法之前?
仅当您需要有关该类的信息时才加载该类。
public class SomethingCaller {
public static Something something = null; // (1) does not cause class loading
public static Class<?> somethingClass = Something.class; // (2) causes class loading
public void doSomething() {
new Something(); // (3) causes class loading
}
}
第(2)和(3)行将导致该类被加载。Something.class对象包含仅来自类定义的信息(第(2)行),因此您需要加载该类。对构造函数(3)的调用显然需要类定义。对于该类上的任何其他方法类似。
但是,第(1)行不会导致类被加载,因为您实际上不需要任何信息,它只是对对象的引用。
编辑:在您更改的问题,您询问是否引用Something.class加载该类。是的,它确实。直到main()被执行,它才加载类。使用以下代码:
public class SomethingTest {
public static void main(String[] args) {
new SomethingCaller();
}
}
public class SomethingCaller {
public void doSomething() {
Class<?> somethingClass = Something.class;
}
}
public class Something {}
此代码不会导致Something.class加载。但是,如果我调用doSomething(),则会加载该类。要对此进行测试,请创建上述类,对其进行编译,然后删除Something.class文件。上面的代码不会因ClassNotFoundException而崩溃。
主要内容:1.类加载过程,2.类加载时机,3.类加载器,4.类加载机制:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。 1.类加载过程 1.1加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Cl
主要内容:JVM架构图,1.类加载子系统作用,2.类加载器分类,3.双亲委派机制,4. 沙箱安全机制,5.其他JVM架构图 1.类加载子系统作用 类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识; ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 加载的类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是
问题内容: 我的JVM崩溃了,并且hs_err文件表明它在尝试加载类时崩溃了。特别是在尝试进行memcpy([libc.so.6 + 0x6aa2c] memcpy + 0x1c)时。我查看了.class文件,并能够确定正在加载的类。 但是,谁能告诉我是什么原因造成的,或者我如何确定更多原因?如果JVM内存不足,它不会抛出错误。非常感谢任何见解。 我包括了我的hs_err文件的摘录。 问题答案:
我正在阅读Horstmann撰写的《Java核心》第10卷中关于断言的第四章,内容是: 有些类不是由类加载器加载的,而是由虚拟机直接加载的。您可以使用这些开关有选择地启用或禁用这些类中的断言。 我对此感到困惑,哪些类将由JVM加载,而不是由类加载器加载,我认为引导类加载器加载了初始类? 谢谢
我最近安装了智能IDEA 2018。但是,当我尝试运行 IntelliJ 时,我收到以下错误消息: 我查看了我的系统环境变量,我把它们贴在下面: 我在命令提示符下检查了我拥有的Java版本: 我检查了我的程序文件: 我还检查了我的程序文件(x86):
简介 Java虚拟机通过装载、连接和初始化一个类型,使该类型可以被正在运行的Java程序使用。 装载:把二进制形式的Java类型读入Java虚拟机中。 连接:把装载的二进制形式的类型数据合并到虚拟机的运行时状态中去。 验证:确保Java类型数据格式正确并且适合于Java虚拟机使用。 准备:负责为该类型分配它所需内存。 解析:把常量池中的符号引用转换为直接引用。(可推迟到运行中的程序真正使用某个符号