【问题标题】:Multi-threaded classloading possible?多线程类加载可能吗?
【发布时间】:2009-07-19 16:54:36
【问题描述】:

是否可以在 Java 中实现多线程类加载器?在元驱动框架中,我需要提前加载数百个类,即,不像系统类加载器那样懒惰。为了加速这一点,我想更好地利用当前的多核 CPU。在我深入探讨之前,如果有人在这个问题上已经有一些经验,或者可能完全清楚 defineClass() 可能是这种情况下的瓶颈,我会很感兴趣。

谢谢 安德烈

【问题讨论】:

    标签: java multithreading classloader


    【解决方案1】:

    我相信目前你会遇到排他锁。在 JDK7 中,类加载器将能够将自己标记为具有并行能力。

    与以往一样,我建议可能进行一些粗略的计算,然后吸一收。

    【讨论】:

    【解决方案2】:

    让一个或多个线程在后台加载一个需要预加载所有类的类并没有错。用 Executor 和 Callables 做一个原型,这样你就可以用 jvisualvm 获得一些分析信息。

    【讨论】:

    • 是的,从技术上讲,应该可以有多个线程加载类,这很清楚。 defineClass() 方法是不同步的,这是一种先决条件。但我想知道 JVM 代码中是否有一个更深层次的同步点可以防止真正的 MT 类加载而不明显?
    • defineClass 不同步,因为类加载被 JVM 定义为单线程。 (至少在 Java 5 和 6 中)几百个类不需要那么长时间来加载您需要加载它的时间范围是多少?
    • 我基本上只是害怕我的框架基于一个不能很好扩展的架构。 100 个类只是开始,但随着框架获得越来越多的功能,类的数量可能会增加到数千个,这可能会导致启动时出现严重的延迟。
    • 好吧,如果你需要加载类,你需要加载它们。您是否做过计时以表明实际需要多长时间?
    • 是的,您是对的,但是如果您不将负载分散到多个用户交互中,那么您一开始的响应速度就会很差(作为回报,随后的响应时间会更快)。这一切都取决于开发的应用程序类型。也就是说,我想要两者兼得:初始化后没有负载和更快的初始化。可以通过利用多个内核进行类加载来实现快速初始化,这正是我最初的问题所想的;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2013-03-11
    • 2021-02-21
    • 2019-01-18
    • 2010-09-27
    相关资源
    最近更新 更多