草庐IT

Java类加载

coder 2024-04-01 原文

我想了解 Java 类加载器的工作原理。看了一些文章,还是有些不明白。

据我了解,第一个类加载器是 Bootstrap 类加载器 (BCL)。 是否由JVM加载?

之后,BCL 加载 rt.jar 库和扩展类加载器 (ECL)。

反过来,ECL 加载扩展和应用程序类加载器 (ACL)。 ACL 负责从类路径加载所有用户开发的类。

这个描述是否正确?

有几个问题:

  1. 每个类加载器在内存中只存在一个实例吗? (BCL,ECL,ACL) ?
  2. 我看过委托(delegate)原则,但对我来说有点不清楚。它是如何工作的,假设我们需要加载 MyClass。首先 jvm 将这个类名赋予 ACL,这对我来说还不清楚,ACL 通过类路径查找,如果没有这样的类,则将此工作委托(delegate)给父级,或者在调用后立即将此工作委托(delegate)给父级,我的意思是 JVM把类名给ACL,它不搜索这个类就把它给ECL,这个CL反过来也不做任何工作,把它给BCL,只有当BCL找不到这个类时才返回给下层水平(ECL)....等等。什么是正确的链?
  3. 当我们创建自定义类加载器时,它的父类是什么?应用程序类加载器?我们可以指定 ,例如 ECL。至于类加载器的层次结构不是继承,我们在构造函数中指定父级。我们能否获取 ECL 类加载器的实例以在我们的自定义 CL 中将其指定为构造函数中的父级。
  4. 为什么 String 、 Object 等类不返回任何 ClassLoadder ?

最佳答案

答案:

  1. As far as I understand the first class loader is the Bootstrap class loader (BCL). Is it loaded by the JVM?

    这没有明确定义,但很可能会用 native 代码编写。

  2. Afterwards, the BCL loads rt.jar library, and the Extension Class Loader (ECL).

    是的,它将加载 rt.jar(直到 Java 8 和 Java 9 一样会有新的模块系统)。它是否加载 ECL 没有明确定义。

  3. In turn, the ECL loads extensions and the Application Class Loader (ACL). The ACL is responsible for loading all user-developed class from the classpath.

    是的,它加载扩展,是否加载 ACL 没有明确定义。实际上,ACL 会加载类路径条目。

  4. There is only one instance of each classloader exists in memory ? (BCL,ECL,ACL) ?

    是的,这是正确的。由于类标识被定义为一对FQCN及其有效的类加载器,否则将无法工作。

  5. I have looked at delegation principle,but it is a little bit unclear for me. How does it work, let's assume we need load MyClass. First jvm gives this class name to the ACL, and here is unclear thing for me, ACL looks through class path and if there is no such class delegates this work to the parent OR it delegates this work to parent right after calling, I mean JVM gives class name to ACL, it doesn't search for this class gives it to ECL, this CL in turn also doesn't do any work and gives it to BCL, and only if BCL cannot find this class it return it to the lower level (ECL) .... and so on. What is the correct chain ?

    在标准 Java 中,存在父优先委托(delegate)模型,这意味着类加载器会先询问其父类,然后才会尝试自行加载类。

  6. When we creating custom class loader what is parent class of it ? Application ClassLoader ? Can we specify , for instance ECL. As far as hierarchy of class loaders is not inheritance, we specify parent in constructor. Can we get instance of ECL classloader to specify it in our custom CL as a parent in constructor.

    自定义类加载器的默认父类是应用程序类加载器。

    问题是您为什么需要这样做?您的程序不太可能正确运行。正式地,您可以通过 YourClass.class.getClassLoader().getParent() 执行此操作。

  7. Why classes like String , Object and so on don't return any ClassLoadder ?

    Bootstrap 类加载器在 API 中表示为 null

关于Java类加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28282667/

有关Java类加载的更多相关文章

  1. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  9. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  10. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

随机推荐