有一个调用findBootstrapClass类加载器的方法,如果它被引导,它会返回一个类。有没有办法找到已经加载的类?
有时我会在其他人的代码中看到这一点。但是当我尝试时,它返回null。
baseUrl = org.company.UploadService.class.getResource(".");
url = new URL(baseUrl, "http://192.168.164.32:9080/mka-web/services/UploadService?wsdl");
Run Code Online (Sandbox Code Playgroud) 我们的项目中存在性能问题,这似乎源于(至少部分)Hibernate 使用类加载器的方式。这是在 Java 线程转储中发现的,这些转储是在我们内部环境的高负载测试期间进行的。转储的 JVM 是运行应用程序的 Weblogic 托管服务器的 JVM,在监控仪表板显示占用线程和待处理用户请求时进行转储。
例子:
"[ACTIVE] ExecuteThread: '126' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x00007f2fe9486000 nid=0x663b waiting for monitor entry [0x00007f2faeae6000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.lang.ClassLoader.loadClass(ClassLoader.java:405)
- waiting to lock <0x000000078c0d76b0> (a weblogic.utils.classloaders.GenericClassLoader)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:178)
at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:187)
at org.hibernate.internal.util.ReflectHelper.getConstantValue(ReflectHelper.java:278)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl$JavaConstantConverter.handleDotStructure(QueryTranslatorImpl.java:592)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl$JavaConstantConverter.visit(QueryTranslatorImpl.java:587)
Run Code Online (Sandbox Code Playgroud)
我们可以在这些线程转储(使用 Samurai/TDA)中看到的是,似乎随时都有大量线程在等待锁定类加载器。这个由 WLS 提供的类加载器似乎是同步的 - 这解释了锁定/阻塞线程模式......
似乎 Hibernate 使用类加载器来评估查询中的表达式。所以我不确定类加载器调用是否真的加载了任何新类。
问题是对类加载器的调用次数似乎一直在进行……有时我观察到多达 30% 的线程总数(~30-40 + 我们的 130)等待获取一个类加载器锁!
-->当大量线程试图为高用户负载(即许多 Hibernate 查询)提供服务时,WLS 类加载器的同步似乎会导致非常高的内部开销。
现在这个同步的类加载器问题似乎是限制我们应用程序吞吐量的主要原因,导致重负载下的性能下降。此外,如果我们扩展 CPU/内存或各种 WLS 特定池(如 …
我正在尝试使用自定义类加载器来加载应用程序所需的所有依赖项。我已经在网站上实现了 customerClassLoader:https : //www.javacodegeeks.com/2013/03/java-handmade-classloader-isolation.html
但是,我不明白如何告诉我的应用程序在需要时使用自定义 classLoader。
例如:让我们说,我有一种方法来发出 http 请求,如下所示。如何告诉应用程序使用自定义 classLoader 加载所需的 jars?
private HttpResponse get() {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
return response;
}
Run Code Online (Sandbox Code Playgroud) 我在 Eclipse 中有一个 gradle 项目。这是我的项目的结构
我在 .cssstyleclass.css中有 css 资源scr/main/resources/css。首先我尝试使用访问它
scene.getStylesheets().add("css/styleclass.css");
Run Code Online (Sandbox Code Playgroud)
但是我收到警告resource not found.我也通过删除module-info.java文件来尝试它。但结果是一样的。
然后我尝试使用
String urlString = ComboBoxStyling.class.getClassLoader().getResource("css/styleclass.css").toExternalForm();
Run Code Online (Sandbox Code Playgroud)
问题是,如果我删除moduele-info.java并应用样式表,这条线会起作用。但是随着module-info.java我收到空指针异常。
我知道的不多,但至少我知道类加载器在 Java 9 中有变化。那么我如何在 Java 9 中做同样的事情。我的module-info.java文件包含以下内容
module pk.training.basit {
exports pk.training.basit;
requires transitive javafx.controls;
}
Run Code Online (Sandbox Code Playgroud)
感谢和问候
巴斯特·马哈茂德·艾哈迈德
我们正在创建一个基于 javassist 的自定义类加载器,在加载时修改一些类的字节码。该项目的一部分也是一个包含安全提供程序的签名 jar。
Loader 的初始化如下所示:
private final Loader initLoader(ClassLoader master) {
final ClassPool pool = ClassPool.getDefault();
final Loader loader = new Loader(master, pool);
try {
loader.addTranslator(pool, new MyTranslator());
} catch (Exception e) {
e.printStackTrace();
}
return loader;
}
Run Code Online (Sandbox Code Playgroud)
本MyTranslator类做了修改,但不关心安全相关的类。的master是系统(父)类加载器。
当应用程序加载相关安全类时,会抛出此异常:
Caused by: java.security.NoSuchProviderException: JCE cannot authenticate the provider EXAMPLE-PROV
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:100) ~[?:1.8.0_121]
at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:230) ~[?:1.8.0_121]
at my.example.app.security.ExampleKeyAgreement.generateSharedSecret(ExampleKeyAgreement.java:56) ~[?:?]
... 22 more
Caused by: java.util.jar.JarException: Class is on the bootclasspath
at javax.crypto.JarVerifier.verify(JarVerifier.java:286) ~[?:1.8.0_121]
at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:159) ~[?:1.8.0_121] …Run Code Online (Sandbox Code Playgroud) 这些是否完全相同:
ClassLoader.getSystemClassLoader() // 1
Run Code Online (Sandbox Code Playgroud)
对比:
obj.getClass().getClassLoader().getSystemClassLoader() // 2
Person.class.getClassLoader().getSystemClassLoader()
Run Code Online (Sandbox Code Playgroud)
是否有可能产生不同结果的情况?
我有两个gradle项目:
API Rest 项目公开了一个POST端点,该端点执行一些 Java 代码的运行时编译。
此 Java 代码扩展了一个在业务项目中定义其父级的类。
该代码的编译通过完成InMemoryJavaCompiler在https://github.com/trung/InMemoryJavaCompiler。
根据应用程序的启动方式,会出现两种情况:
启动和调试 API Rest 时IntelliJ工作正常。代码已编译并可以执行。
使用它启动和调试 API Rest 时java -jar不起作用。该 jar 与bootJar任务一起打包。Java 可执行文件来自 JDK
不准确意味着业务项目中定义的InMemoryJavaCompiler类在运行时不被类加载器看到,因此编译失败。
示例堆栈跟踪
2019-01-19 10:33:50.955 ERROR 1636 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mdkt.compiler.CompilationException: Unable to compile the …Run Code Online (Sandbox Code Playgroud) 我在服务器上运行 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 …
我正在尝试xml为 spring-batch测试读者,但我遇到了下一个问题:
java.lang.ClassCastException: class org.vl.batch.domain.CustomerXml cannot be cast to class org.vl.batch.domain.CustomerXml
(org.vl.batch.domain.CustomerXml is in unnamed module of loader 'app';
org.vl.batch.domain.CustomerXml is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @7129c8ee)
at org.vl.batch.configuration.JobConfiguration.lambda$customerItemWriter$0(JobConfiguration.java:73) ~[classes/:na]
Run Code Online (Sandbox Code Playgroud)
如何在不排除开发工具的情况下解决此问题?
plugins {
id 'org.springframework.boot' version '2.2.0.M3'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = 'org.vl.spring.batch.learning'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/snapshot' }
maven …Run Code Online (Sandbox Code Playgroud) classloader ×10
java ×10
class ×1
classloading ×1
compilation ×1
hibernate ×1
java-9 ×1
javafx ×1
javassist ×1
openjdk-11 ×1
security ×1
spring ×1
spring-batch ×1
spring-boot ×1
weblogic ×1