2012-12-24 23 views
11

Bunun için basit java profiler yapmaya ve ClassLoader kullanmaya çalışıyorum. i bu çıktıyı almak bu sınıf yükleyici kullanmayı deneyin ettiğinizdeRMI çağırma ile ClassLoader

import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 

public class CustomClassLoader extends ClassLoader { 
    private Notifier notifier; 

    public CustomClassLoader() { 
     super(); 
    } 

    public CustomClassLoader(ClassLoader parent) { 
     super(parent); 
    } 

    private void initNotifier() { 
     if (notifier != null) return; 
     try { 
      System.out.println("2"); 
      Registry registry = LocateRegistry.getRegistry(Const.registryPort); 
      System.out.println("3"); 
      notifier = (Notifier) registry.lookup(Const.stubName); 
      System.out.println("4"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 

    @Override 
    protected synchronized Class<?> loadClass(String name, boolean resolve) 
            throws ClassNotFoundException { 
     System.out.println("0"); 
     Class clazz = super.loadClass(name, resolve); 
     System.out.println("1"); 
     initNotifier(); 
     System.out.println("5"); 
     try { 
      notifier.classLoaded(name); 
      System.out.println("6"); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
     return clazz; 
    } 
} 

(I 1.6_37 ve 1.7_10 JKD kullanmayı denedik):

Bu ClassLoader benim uygulamasıdır

C:\Users\Scepion1d>java -cp C:\Users\Scepion1d\Dropbox\Workspace\IntellijIDEA\pr 
ofiler\out\artifacts\loader\loader.jar;C:\Users\Scepion1d\Dropbox\Workspace\Inte 
llijIDEA\app\out\production\app -Djava.system.class.loader=CustomClassLoader Main 
0 
1 
2 
0 
1 
2 
3 
0 
1 
2 
3 
java.lang.IllegalArgumentException: Non-positive latency: 0 
     at sun.misc.GC$LatencyRequest.<init>(GC.java:190) 
     at sun.misc.GC$LatencyRequest.<init>(GC.java:156) 
     at sun.misc.GC.requestLatency(GC.java:254) 
     at sun.rmi.transport.DGCClient$EndpointEntry.lookup(DGCClient.java:212) 
     at sun.rmi.transport.DGCClient.registerRefs(DGCClient.java:120) 
     at sun.rmi.transport.ConnectionInputStream.registerRefs(ConnectionInputS 
tream.java:80) 
     at sun.rmi.transport.StreamRemoteCall.releaseInputStream(StreamRemoteCal 
l.java:138) 
     at sun.rmi.transport.StreamRemoteCall.done(StreamRemoteCall.java:292) 
     at sun.rmi.server.UnicastRef.done(UnicastRef.java:431) 
     at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
     at CustomClassLoader.initNotifier(CustomClassLoader.java:22) 
     at CustomClassLoader.loadClass(CustomClassLoader.java:35) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
     at sun.security.jca.ProviderConfig$3.run(ProviderConfig.java:234) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:22 
5) 
     at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:205) 
     at sun.security.jca.ProviderList.getProvider(ProviderList.java:215) 
     at sun.security.jca.ProviderList.getService(ProviderList.java:313) 
     at sun.security.jca.GetInstance.getInstance(GetInstance.java:140) 
     at java.security.Security.getImpl(Security.java:659) 
     at java.security.MessageDigest.getInstance(MessageDigest.java:129) 
     at java.rmi.dgc.VMID.computeAddressHash(VMID.java:140) 
     at java.rmi.dgc.VMID.<clinit>(VMID.java:27) 
     at sun.rmi.transport.DGCClient.<clinit>(DGCClient.java:66) 
     at sun.rmi.transport.ConnectionInputStream.registerRefs(ConnectionInputS 
tream.java:80) 
     at sun.rmi.transport.StreamRemoteCall.releaseInputStream(StreamRemoteCal 
l.java:138) 
     at sun.rmi.transport.StreamRemoteCall.done(StreamRemoteCall.java:292) 
     at sun.rmi.server.UnicastRef.done(UnicastRef.java:431) 
     at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
     at CustomClassLoader.initNotifier(CustomClassLoader.java:22) 
     at CustomClassLoader.loadClass(CustomClassLoader.java:35) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
     at sun.security.jca.ProviderConfig$3.run(ProviderConfig.java:234) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:22 
5) 
     at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:205) 
     at sun.security.jca.ProviderList.getProvider(ProviderList.java:215) 
     at sun.security.jca.ProviderList$3.get(ProviderList.java:130) 
     at sun.security.jca.ProviderList$3.get(ProviderList.java:125) 
     at java.util.AbstractList$Itr.next(AbstractList.java:345) 
     at java.security.SecureRandom.getPrngAlgorithm(SecureRandom.java:522) 
     at java.security.SecureRandom.getDefaultPRNG(SecureRandom.java:165) 
     at java.security.SecureRandom.<init>(SecureRandom.java:133) 
     at java.rmi.server.UID.<init>(UID.java:92) 
     at java.rmi.server.ObjID.<clinit>(ObjID.java:71) 
     at java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:158) 

     at java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:106) 

     at java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:73) 
     at CustomClassLoader.initNotifier(CustomClassLoader.java:20) 
     at CustomClassLoader.loadClass(CustomClassLoader.java:35) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

sorunun bu RMI sunucu olan düşündüm, ama ben başka RMI istemci yazdım ve iyi çalışıyor. Sorun (lar) ın nerede olduğunu ve nasıl çözüleceğini bilen var mı?

+1

başka (daha yeni ya da başka bir versiyonu) java denemek ve yardım etmezse, o zaman bir hata (http://bugs.sun.com/) – tcb

+1

Bu gerçekten kazara özyineleme olduğunu sunmalıdır. Yığın izine iyi bakın. Sınıf yükleyicinizi aşırı kullanıyor görünüyorsunuz. – EJP

+0

Daha fazla takip etmek için, "0" için println’e 'name' de ekleyebilirsiniz. – JoshDM

cevap

2

TL; DR: Kök sınıfı yükleyici gibi ağır yan etkileri olan bir sınıf yükleyici kullanmayın.

sorun, kullanılan önce sınıf sun.rmi.transport.DGCClient üzerinde const alan gcInterval başlatılmamış olduğunu (ve dolayısıyla değeri 0 gösterilmektedir). Bunun nedeni, sınıf yükleyicinizin, yeni bir DGCClient örneği oluşturan RMI yoluyla çağrı yapmasıdır. DGCClient kurucusu yürütülürken başka bir sınıf yüklenir (yığın izine bakınız). Sınıf yükleyicisine yapılan bu üçüncü çağrı, yeni bir DGCClient örneği oluşturmayan RMI çağrısını tekrar tetikler, ancak daha önce oluşturulmuş olanı kullanır ve bunun üzerine bir çağrı yapar. Bu, henüz başlatılmamış bu sabit alanın kullanılmasına yol açan yarı başlatılmış bir nesne üzerinde bir çağrı yapıldığını gösterir. Biz muhtemelen bu tür öngörülemeyen yan etkiler olmadan yüklenir varsayabiliriz her Java sınıfına beri bunu için Sun/Oracle suçlayamazsın

.

İlgili konular