标签: classloading

NoClassDefFoundError java.lang包中的类的"错误名称"

我在主机上运行Cassandra 2.2.11(并且不会升级).我在cron作业中定期运行nodetool命令进行监控.nodetool实现为另一个使用JMX与Cassandra java进程通信的java进程.我每分钟发出五个左右的命令.

偶尔(不是任何可识别的模式),执行nodetool将失败NoClassDefFoundError,引用类来自java.lang.例如,

java.lang.NoClassDefFoundError: java/lang/Thread (wrong name: java/lang/Thread)
    at java.lang.Class.getDeclaredFields0(Native Method)
    at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
    at java.lang.Class.getDeclaredField(Class.java:2068)
    at java.util.concurrent.FutureTask.<clinit>(FutureTask.java:476)
    at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleWithFixedDelay(ScheduledThreadPoolExecutor.java:590)
    at sun.rmi.transport.tcp.TCPChannel.free(TCPChannel.java:347)
    at sun.rmi.server.UnicastRef.free(UnicastRef.java:431)
    at sun.rmi.server.UnicastRef.done(UnicastRef.java:448)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:132)
    at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:205)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1955)
    at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1922)
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:287)
    at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270)
    at org.apache.cassandra.tools.NodeProbe.connect(NodeProbe.java:183)
    at org.apache.cassandra.tools.NodeProbe.<init>(NodeProbe.java:150)
    at org.apache.cassandra.tools.NodeTool$NodeToolCmd.connect(NodeTool.java:302)
    at org.apache.cassandra.tools.NodeTool$NodeToolCmd.run(NodeTool.java:242)
    at org.apache.cassandra.tools.NodeTool.main(NodeTool.java:158)
Run Code Online (Sandbox Code Playgroud)

在此堆栈跟踪中,错误发生在类初始化期间FutureTask.我也见过

java.lang.NoClassDefFoundError: java/lang/Object (wrong name: java/lang/Object)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethod(Class.java:2128)
    at java.lang.invoke.MethodHandleImpl$Lazy.<clinit>(MethodHandleImpl.java:614) …
Run Code Online (Sandbox Code Playgroud)

java reflection classloading

11
推荐指数
1
解决办法
1256
查看次数

Why static block is not executed

As per java doc, static block is executed when the class is initialized.

Could anyone please tell me why static block is not executed when I run below code?

class A {
    static {
        System.out.println("Static Block");
    }
}

public class Main {

    public static void example1() {
        Class<?> class1 = A.class;
        System.out.println(class1);
    }


    public static void example2() {
        try {
            Class<?> class1 = Class.forName("ClassLoading_Interview_Example.ex1.A");
            System.out.println(class1);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        example1();
    }
}
Run Code Online (Sandbox Code Playgroud)

java static-block classloading

6
推荐指数
1
解决办法
1316
查看次数

OpenJdk 初始启动时间很慢

我在服务器上运行 openjdk 11.0.3。每当服务器重新启动时(每晚):对于我的应用程序的第一次初始启动,用户必须等待 35 秒才能启动应用程序。(在从 main 方法编写第一个 System.out.println 之前。)(尽管后续启动非常快)我尝试了以下选项来调试它:

-Xlog:class+load:file=classload.txt
Run Code Online (Sandbox Code Playgroud)

以下是最重要的发现:

... 
[2.284s][info][class,load] jdk.internal.loader.URLClassPath$FileLoader source: jrt:/java.base
[5.032s][info][class,load] sun.security.rsa.RSASignature$SHA1withRSA source: jrt:/java.base
…
[5.051s][info][class,load] java.util.LinkedList$Node source: jrt:/java.base 
[8.121s][info][class,load] pos.LFChangeable source: file:/C:/Users/rho/AppData/Roaming/edapp/pos.jar
…
[8.135s][info][class,load] java.io.FileNotFoundException source: jrt:/java.base
[10.584s][info][class,load] sun.reflect.misc.ReflectUtil source: jrt:/java.base
…
[11.744s][info][class,load] java.security.NoSuchAlgorithmException source: jrt:/java.base
[34.853s][info][class,load] jdk.internal.logger.DefaultLoggerFinder source: jrt:/java.base
Run Code Online (Sandbox Code Playgroud)

为什么在加载 java.security.NoSuchAlgorithmException 和 jdk.internal.logger.DefaultLoggerFinder 之间挂起 23 秒?那么其他几秒钟的减速呢?

编辑:根据评论,我会澄清一些。这是一个 Windows rdp 服务器。实际上,它不止一台服务器,但问题仍然存在于所有服务器上。该应用程序是一个独立的应用程序。所以每天早上都会出现问题,因为登录启动应用程序的用户会在“没有任何反应”时尝试多次启动它。我现在已经多次尝试重新启动其中一台服务器,这就是我发现的:

重新启动后使用 java11 启动我的应用程序平均需要 40 秒,然后才会出现第一个 System.out.println。然后在我的第一个 JFrame 显示之前只有 1-2 秒。重新启动后使用 java8 (sun) 启动我的应用程序在第一个 System.out.println 之前平均需要 16 秒。但是在我的第一个 JFrame 显示之前,我得到了 25 秒的延迟。在已经使用 java8 …

java classloader classloading openjdk-11

5
推荐指数
1
解决办法
2498
查看次数

在生产中不使用 spring-boot 类加载器是否有警告?

什么

我想用jdk.internal.loader.ClassLoaders$AppClassLoaderspring-boots 代替org.springframework.boot.loader.LaunchedURLClassLoader。但是,我不确定这将如何影响 spring-boot 运行时。

为什么

我们最近在java.lang.InstantiationErrorjava 的parallelStream(). 我了解到并行流中的线程正在使用AppClassLoader,因此无法找到驻留在类加载器层次结构中LaunchedURLClassLoader的子级中的应用程序类AppClassLoader

如何

spring -boot 文档显示您可以在不使用类加载器的情况下运行解压的 spring-boot jar。这很方便地意味着应用程序类也被加载到 中AppClassLoader,从而解决了我们的问题parallelStream()

$ java -cp BOOT-INF/classes:BOOT-INF/lib/* com.example.MyApplication
Run Code Online (Sandbox Code Playgroud)

注意:这也是 Intellij IDEA 运行 spring-boot 应用程序的方式。

问题

谁知道 spring-boot 类加载器是否所做的不仅仅是启用我应该了解的可执行 jar 和 war 文件。我发现文档不够明确。在生产中不使用 spring-boot 类加载器是否安全?

java classloader spring-boot classloading

5
推荐指数
1
解决办法
915
查看次数

Java:Extensions Class Loader在Java 13中从哪里获取类?

我已经找到的所有文档都提到了“ jre / lib / ext”文件夹,但是在我的JRE 13安装中不存在。

我猜在Java 8(可以在jre / lib / ext中看到罐子)和Java 13之间的某个地方,它们移动了,但是我无法确定何时以及如何完成。

有人可以根据扩展类当前所在的位置来详细说明新JRE的情况吗?

java classloader dynamic-class-loaders classloading java-13

3
推荐指数
1
解决办法
63
查看次数

Java类存在于类路径中,但启动失败,错误:无法找到或加载主类

我有一个foobar.jar包含以下两个类的jar文件:

public class Foo {

    public static void main(String[] args) {
        System.out.println("Foo");
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个类看起来像这样:

import javax.batch.api.chunk.ItemProcessor;

public class Bar implements ItemProcessor {

    public static void main(String[] args) {
        System.out.println("Bar");
    }

    @Override
    public Object processItem(Object item) throws Exception {
        return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用以下命令执行程序,程序将按预期运行并打印Foo:

$ java -cp foobar.jar Foo
Foo
$ 
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试使用类中的main方法启动程序Bar,JVM会输出启动错误并退出:

$ java -cp foobar.jar Bar
Error: Could not find or load main class Bar
$
Run Code Online (Sandbox Code Playgroud)

这是同样的错误,就好像我会尝试使用不在jar中的类来启动程序,例如

$ java -cp foobar.jar BarNotThere
Error: …
Run Code Online (Sandbox Code Playgroud)

java jvm classpath classnotfoundexception classloading

1
推荐指数
1
解决办法
7164
查看次数