2016-08-17 4 views
1

私はjavaagent Jar simpleAgent.jarを持っています。私はそれにクラスをredifineするためにそれを使用し、私は私が3つのアプリケーションを起動するときに、私は同じエージェントの瓶を使用することができ、三つの異なるアプリケーションapp1.jarapp2.jarapp3.jarを持ってredifine異なるJavaアプリケーションが同じjavaagentを使用できますか?

public class Premain { 

    private static Instrumentation instrumentation; 

    private static final Map<String, Class> allLoadClassesMap = new ConcurrentHashMap<>(); 

    public static void premain(String agentArgs, Instrumentation inst) { 
     instrumentation = inst; 
     cacheAllLoadedClasses("com.example"); 
    } 

    public static void cacheAllLoadedClasses(String prfixName) { 
     try { 
      Class[] allLoadClasses = instrumentation.getAllLoadedClasses(); 
      for (Class loadedClass : allLoadClasses) { 
       if (loadedClass.getName().startsWith(prfixName)) { 
        allLoadClassesMap.put(loadedClass.getName(), loadedClass); 
       } 
      } 
      logger.warn("Loaded Class Count " + allLoadClassesMap.size()); 
     } catch (Exception e) { 
      logger.error("", e); 
     } 
    } 
} 

を避けるために、いくつかのクラスをキャッシュされましたか?例えば:

java -javaagent:simpleAgent.jar -jar app1.jar 
java -javaagent:simpleAgent.jar -jar app2.jar 
java -javaagent:simpleAgent.jar -jar app3.jar 

私はjavaagentの実装を知らないので、私は同じjavaagentを使用してAPP1またはAPP2またはAPP3クラッシュでトリガできることを怖がっていました。

+0

エージェントの 'jar'ファイルは決して特別なものではありません。あなたは 'jar'ファイルをあなたが望むだけ多くのJVMの間で共有することができます。読み込み専用であれば、普通のクラス読み込みプロセスの場合です。 – Holger

答えて

2

各JVMインスタンスは独立しており、アプリケーションレベルで何かをしない限り、他のJVMについて「認識」しません。だから、一般的に答えは "はい、同じJarファイルをjavaagentにするか、JVMインスタンスを必要なだけ多く使うことができます。"

0

Javaagetは、クラスパス上のjarファイルと同様に、VMによって処理されます。これらのファイルは読み取り専用で、すべての状態は実行中のVMに含まれ、複数のプロセス間で安全に共有されます。

関連する問題