, JVM

2012-06-27 31 views
5

'un önyükleme aşamasının sonunu algılar JVM'nin önyükleme aşamasının sonunu algılamanın bir yolu var mı?, JVM

düzenlemek ::

yüzden biraz daha bağlam sağlamak için, ne ben yapmaya çalışıyorum enstrüman JDK etmektir. Ve bu, her LOAD, STORE, INVOKE bayt kodu komutunu kaydeden tam üflemeli bir enstrümantasyon. Talimatlar yürütüldükçe, verileri, xbootclasspath öğesinden yüklenen statik bir yönteme gönderilir. Bu statik yöntem, tüm bu bilgileri toplar ve tüm bunları daha sonra analiz yapmak için bir iz olarak saklar.

Şimdi, bunu JDK için yaptığımda, sınıfların JVM'ye yüklenme şeklini bozmak istemiyorum, bu da bir program çökmesine neden olabilir. Bunu yapmanın en iyi yolunun, JVM'nin önyükleme yapıldığı zamandaki noktayı saptamak olduğunu tahmin etmekteydim, böylece enstrümenemi daha sonra güvenle açabileceğim. (Ben önyükleme yaparken, kodun hiçbirini almayı planlamıyorum.) Bu bile bu konuda gitmek için doğru yol mu? FERRARI ve MAJOR içine bakarak benim önceki yorum hakkında ek

+0

Henüz yüklü java kodunuzun içinden mi demek istiyorsunuz? Veya harici bir programdan mı? yükleme/profilleme için mi? –

+4

JVM tembel yükleme olduğundan, bu asla gerçekleşmez. Kapatmada ilk kez yüklenen sınıflara sahip olabilirsiniz. –

+0

@PeterLawrey rt.jar'ın çekirdek sınıfları için bu doğru mu? –

cevap

2

ben birkaç şey söylemek istiyorum:

  • Her iki araç derlenmiş Java JAR arşivleri gibi indirmek için mevcuttur.
  • Bu yüzden bugün bu araçları yaratan bilim adamlarına yazdım ve onlara sorularımızı sorduk. Bir cevap alacağım anda, burada bir rapor vereceğim. Her neyse, FERRARI'nın mimarisini inceledim ve nasıl yaptıklarını öğrenmiş olabileceğimi düşündüm.

Yani burada benim eğitimli tahminim (hala denenmemiş) Ne yapabilirsin hakkındadır:

  • Enstrüman JDK sınıfları.
  • Aşağıda açıklandığı gibi basit bir sınıf BootstrapLock ekleyin.
  • Enstrümental + yeni sınıfı değiştirilmiş bir rt.jar'a yeniden paketleyin.
  • Aşağıda açıklandığı gibi biraz kukla Java agent yazın.

    • Ajanlar ana uygulama sınıfı önce yüklenir, ancak ön yükleme sonrasında şu şekildedir:
    public class BootstrapLock { 
        private static volatile boolean inBootstrap = true; 
    
        public static boolean inBootstrap() { 
         return inBootstrap; 
        } 
    
        public static synchronized void setEndOfBS() { 
         inBootstrap = false; 
        } 
    } 
    
    public class DummyAgent { 
        public static void premain(String options, Instrumentation ins) { 
         BootstrapLock.setEndOfBS(); 
        } 
    } 
    

    Böylece temelde mantık. Dolayısıyla, maddenin aktif olduğu gerçeği, önyüklemenin bitmiş olduğu anlamına gelir. Böylece, inBootstrap numaralı global işaretleyiciyi kapatabilir.

  • Enstrümantal sınıflarınız, ek enstrümantasyon kodlarının baypas edilip edilmeyeceğini belirlemek için işaretleyiciyi kontrol edebilir.

Yakında bunu test etmek için yeterli zamanım olup olmadığından emin değilim, ama en azından bu cevabı buraya göndermek istedim, belki de siz Vijai'yi de inceleyebilir ve bazı geri bildirimler sağlayabilirsiniz. Dört göz ikiden fazla görüyor ...


Güncelleme: FERRARI yazarlardan biri benim soruşturma yanıtladı ve yukarıda benim açıklama onaylamıştır. JVM'yi önyüklemeyi bitirmiş bir işaretçi olarak kullanabilirsiniz. Belki de ek sınıfa ihtiyacınız yoktur, ancak ajanın henüz JVM'ye yüklenip yüklenmediğini kontrol edin. İşleri daha da basitleştirecek, sadece iyi performans gösterip göstermediğini bilmiyorum. Sadece test et.

+0

, ancak ajan yüklendiyse bile, o zaman önyükleme işleminin tamamlandığının bir garantisi nedir? belki burada temel bir şey eksik. Cevabınız için teşekkürler! – vijay

+1

Daha kesin olmak gerekirse, sınıf yüküne bağlı değil, ajanın 'premain' yöntemlerini çağırıyor. Bu yöntem çağrıldığında, her türlü JVM kodunu çağırabilirsiniz. Bu da FERRARI adamlarının dediği şey. Yazdıklarımı "temelde mantık şöyledir:" şeklinde yeniden okuyun. – kriegaex

+0

şimdi daha net görünüyor, ama son bir şüphe: Ne tür bir JVM koduyla ne demek istiyorsun? Bu, premain çağrıldıktan sonra, enstrümantasyon kodumu yürütmenin JVM'yi çökertmeyeceğine emin olabilir mi? – vijay