Java 类加载:性能影响

本文探讨了Java的`ClassLoader.loadClass()` API在第三方库、JDBC驱动、框架和应用服务器中的使用,以及其可能导致的性能问题。在多线程环境中频繁调用可能导致线程阻塞,影响应用性能。文章分析了原因并提出了解决方案,包括避免在运行时多次加载相同类,以及使用故障排除工具定位问题。
摘要由CSDN通过智能技术生成

java.lang.ClassLoader#loadClass() API 由第三方库、JDBC 驱动程序、框架和应用程序服务器使用,将 java 类加载到内存中。应用程序开发人员不经常使用此 API。但是,当他们使用诸如“”或“”之类的API时,他们会在内部调用此“”API。java.lang.Class.forName()org.springframework.util.ClassUtils.forName()java.lang.ClassLoader#loadClass()

在运行时,在不同线程之间频繁使用此 API 可能会降低应用程序性能。有时它甚至会使整个应用程序无响应。在这篇文章中,让我们进一步了解这个API及其性能影响。

'classloader.loadclass()' API 的用途是什么?

通常,如果我们想实例化一个新对象,我们会像这样编写代码:

new io.ycrash.DummyObject();

但是,您可以使用 ClassLoader.loadClass() API 并实例化对象。以下是代码的外观:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); brClass<?> myClass = classLoader.loadClass("io.ycrash.DummyObject"); brmyClass.newInstance(); 

您可以注意到在第 2 行中调用了 “”。此行将 '' 类加载到内存中。在第 3 行中,“”类使用“”API 实例化。classLoader.loadClass()io.ycrash.DummyObjectio.ycrash.DummyObjectnewInstance()

这种实例化对象的方式就像用手触摸鼻子,通过你的脖子后面。您可能想知道为什么有人会这样做。只有在编写代码时知道类的名称时,才能使用“new”实例化对象。在某些情况下,您可能只在运行时知道类的名称。例如,如果您正在编写框架(如Spring框架,XML解析器等),您将知道仅在运行时要实例化的类名。在编写代码时,您将不知道将实例化哪些类。在这种情况下,您最终将不得不使用“”API。ClassLoader.loadClass()

哪里使用'classloader.loadclass()'?

''用于几个流行的第三方库,JDBC驱动程序,框架和应用程序服务器。本节重点介绍一些使用“”API的流行框架。ClassLoader.loadClass()ClassLoader.loadClass()

Apache Xalan

当您使用Apache Xalan框架序列化和反序列化XML时,将使用“”API。下面是使用 Apache Xalan 框架中的 '' API 的线程的堆栈跟踪。ClassLoader.loadClass()ClassLoader.loadClass()

at java.lang.ClassLoader.loadClass(ClassLoader.java:404) br- locked <0x6d497769> (a com.wm.app.b2b.server.ServerClassLoader) brat com.wm.app.b2b.server.ServerClassLoader.loadClass(ServerClassLoader.java:1175) brat com.wm.app.b2b.server.ServerClassLoader.loadClass(ServerClassLoader.java:1108) brat org.apache.xml.serializer.ObjectFactory.findProviderClass(ObjectFactory.java:503) brat org.apache.xml.serializer.SerializerFactory.getSerializer(SerializerFactory.java:129) brat org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.jbrava:260) brat org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:330) brat org.springframework.ws.client.core.WebServiceTemplate$4.extractData(WebServiceTemplate.java:441) br:br:

谷歌 GUICE 框架

当您使用Google GUICE框架时,将使用“”API。下面是使用Google GUICE框架中的“”API的线程的堆栈跟踪。ClassLoad

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值