【发布时间】:2016-09-16 05:39:52
【问题描述】:
我试图理解为什么 JVM 决定在某些类似乎不需要时加载它。考虑以下示例代码:
public class Foo {
public void foo() {
}
static class Bar {
}
public Bar bar() {
return new Bar();
}
}
调用new Foo().foo() 时,类加载器不会加载Bar,因为它不需要。但是,如果我们将示例更改为让 bar 返回子类的实例:
public class Foo {
public void foo() {
}
static class Bar {
}
static class BigBar extends Bar {
}
public Bar bar() {
return new BigBar();
}
}
调用new Foo().foo() 会导致类加载器同时加载Bar 和BigBar 类,即使它们都不需要。为什么?
除了这个特定的场景之外,有没有办法了解 JVM 为何决定它需要加载一个类?
【问题讨论】:
-
你的问题很神秘。如果你有JDK8,将使用JDK8。不能同时使用 2 个 JDK。
-
您是否使用
-target 1.7编译了代码并测试了它如何在7 版本的JRE 上运行?这将是一种更直接的方式来查看它是如何处理的,而不是通过猜测类加载器在做什么。 -
@JoshStone 哪个代码?哪些课? “一些代码试图从 Java 8 加载一些类”并没有提供太多的工作。
-
我有一个类,其中包含一些返回 CompletableFuture(JDK 8 类)的方法。根据我对 Java 类加载的理解,在我实际调用返回它的方法之前,不应加载 CompletableFuture。我没有调用这样的方法,但它仍在加载中。
-
@JoshStone 我很惊讶
CompletableFuture不会在那个时候被加载,但至少在这种情况下很容易解释当你在那里有null时,类型变得无关紧要。它不是“(CompletableFuture)null”,它只是一个简单的 null,并且任何东西都不需要类信息。
标签: java classloader