2009-07-19 6 views
5

Est-il possible d'implémenter un chargeur de classe multithread dans Java? Dans un cadre méta-conduit, j'ai besoin de charger plusieurs centaines de classes à l'avance, c'est-à-dire, pas aussi paresseusement que le classloader du système. Afin d'accélérer cela, je voudrais mieux utiliser les processeurs multi-cœurs actuels. Avant de plonger là-dedans, je serais intéressé si quelqu'un a déjà une certaine expérience sur cette question ou s'il est tout à fait clair que peut-être defineClass() est le goulot d'étranglement dans ce cas.La classification par classes multi-thread est-elle possible?

Merci Andre

Répondre

6

Je crois que vous allez actuellement toucher un verrou exclusif. En JDK7, les chargeurs de classes pourront se marquer comme étant capables de fonctionner en parallèle.

Comme toujours, je suggère de faire éventuellement des calculs de back-of-envelope, puis de les voir à la va-et-vient.

+0

OK, je vais vérifier le L'API classloader JDK 7.0 en premier. Si vous avez raison avec le verrou dans n'importe quel JDK <7.0, il peut y avoir au moins l'avantage du chargement parallèle de code octet du système de fichiers et du prétraitement. Je vais faire quelques tests pour voir si cela est assez bon pour mes fins. –

+1

Voici un lien: http://openjdk.java.net/groups/core-libs/ClassLoaderProposal.html. Je ne sais rien de plus à jour que ça. –

+0

Merci Tom, lien très complet montrant la direction et la situation actuelle. –

0

Il n'y a rien de mal à avoir un ou plusieurs fils chargeant une classe en arrière-plan qui exige que toutes les classes dont vous avez besoin pour précharger. Faites un prototype avec un Executor et des Callables pour pouvoir obtenir des informations de profilage avec jvisualvm.

+1

Oui, techniquement, il devrait être possible d'avoir plusieurs classes de chargement de threads, c'est assez clair. La méthode defineClass() n'est pas synchronisée, ce qui est une condition préalable. Mais je me demande s'il y a un point de synchronisation quelque part plus profond dans le code de la JVM qui empêche la charge de classe MT réel sans être évident? –

+1

defineClass n'est pas synchronisé car le chargement de classe est défini comme un thread unique par la JVM. (Dans Java 5 et 6 au moins) Quelques centaines de classes ne prennent pas autant de temps à charger quel est le délai dont vous avez besoin pour charger? –

+0

Je n'ai fondamentalement peur que de baser mon cadre sur une architecture qui ne s'adapte pas très bien. 100s de classes n'est que le début mais comme le framework obtient de plus en plus de fonctionnalités, le nombre de classes peut aller jusqu'à des milliers, ce qui peut conduire à une sérieuse latence au démarrage. –