2012-09-06 9 views
9

olmadan uygulama içinden yığın dökümü oluşturma HotSpotDiagnosticMXBean sınıfını kullanmadan uygulamamın içinden nasıl bir yığın dökümü oluşturabilirim? java/rt.jar erişim kısıtlaması nedeniyle HotSpotDiagnosticMXBean bağımlılığı ile derleyemiyorum. Eclipse.compiler hatasının nasıl çözüleceğini biliyorum, ancak derlemem için bunu nasıl düzeltebilirim? Programlı olarak bir yığın dökümü oluşturmanın bir yolu var mı? o HotSpotDiagnosticMXBean bağımlılık var dolayıHotSpotDiagnosticMXBean

+0

bunu okudunuz mu: http://java.sun.com/developer/technicalArticles/J2SE/monitoring/? –

+0

Erişim kısıtlamasını kaldıramazsınız, böylece yapmanız gereken şekilde yapabilirsiniz? Ya bunu yapman gerekiyor ve erişim hakkına sahip olabilirsiniz ya da denemeseniz bu durumda denemelisiniz. –

+0

@Peter Lawrey kısıtlamayı kaldıramıyorum (belki derleyici seçeneği var mı?) Ikinci seçenek bir yığın dökümü başka bir şekilde tetiklemektir. – Chriss

cevap

14

görünüyor. Kopyaladığınız jar'ı "Harici kavanoz ekle" kullanarak yapı yoluna bakın. Bu, Nesne oluşturmanıza ve Yığın dökümü almanıza olanak tanır.

new HotSpotDiagnostic().dumpHeap("d:\\HeapDump1",true); 

Heapdump'ı bu şekilde üretmeyi başardım. Herhangi bir çalışma zamanı çakışma hatası arayarak arıyordum. Neyse ki hiç.

+0

Yansıma çalışmaları! Birisi sadece "HotSpotDiagnosticMXBean" sınıfının mevcut jdk'de mevcut olup olmadığını kontrol etmek için var. – Chriss

+0

https://blogs.oracle.com/sundararajan/entry/programmatically_dumping_heap_from_java adresinden uyarlanmış gibi görünüyor. –

+0

Bunun işe yarayacağından emin misiniz? Eğer şunu yazarım: getMethod ("dumpHeap", String.class, boolean.class) .. "" String, Class , Class Sınıfları için geçerli değil "hatası alıyorum ... diziyi kullanmam gerekiyor: yeni Class [ ] {String.class, boolean.class} 2. parametre olarak çağrılır ve bu şekilde yapılır: m.invoke (hotspotMBean, new Object [] {dosyaAdı, Boolean.valueOf (live)}); – Racky

0

VisualVM bir yığın dökümü yapabilirsiniz.

Ayrıca linux sistemlerinde jhat komutunu da deneyebilirsiniz.

+1

Biliyorum, ama harici bir programa ihtiyaç duymadan, benim uygulamaumdan bir yığın yığınını tetiklemek istiyorum. – Chriss

0

Bu sınıf herkese açık, bu nedenle erişiminiz bulunamayacağının tek nedeni, JVM sürümünüzde onun çok eski olması değil.

Örnek, Java 6 ve 7'de derleme ve iyi çalışır. Büyük olasılıkla, yeni bir Java sürümüne yükseltmeyi deneyin.

package lab.heapdump; 

import javax.management.MBeanServer; 
import java.lang.management.ManagementFactory; 
import java.lang.reflect.Method; 


@SuppressWarnings("restriction") 
public class HeapDump { 
    // This is the name of the HotSpot Diagnostic MBean 
    private static final String HOTSPOT_BEAN_NAME = 
     "com.sun.management:type=HotSpotDiagnostic"; 

    // field to store the hotspot diagnostic MBean 
    private static volatile Object hotspotMBean; 

    /** 
    * Call this method from your application whenever you 
    * want to dump the heap snapshot into a file. 
    * 
    * @param fileName name of the heap dump file 
    * @param live flag that tells whether to dump 
    *    only the live objects 
    */ 
    static void dumpHeap(String fileName, boolean live) { 
     // initialize hotspot diagnostic MBean 
     initHotspotMBean(); 
     try { 
      Class clazz = Class.forName("com.sun.management.HotSpotDiagnosticMXBean"); 
      Method m = clazz.getMethod("dumpHeap", String.class, boolean.class); 
      m.invoke(hotspotMBean , fileName, live); 
     } catch (RuntimeException re) { 
      throw re; 
     } catch (Exception exp) { 
      throw new RuntimeException(exp); 
     } 
    } 

    // initialize the hotspot diagnostic MBean field 
    private static void initHotspotMBean() { 
     if (hotspotMBean == null) { 
      synchronized (HeapDump.class) { 
       if (hotspotMBean == null) { 
        hotspotMBean = getHotspotMBean(); 
       } 
      } 
     } 
    } 

    // get the hotspot diagnostic MBean from the 
    // platform MBean server 
    private static Object getHotspotMBean() { 
     try { 
      Class clazz = Class.forName("com.sun.management.HotSpotDiagnosticMXBean"); 
      MBeanServer server = ManagementFactory.getPlatformMBeanServer(); 
      Object bean = 
       ManagementFactory.newPlatformMXBeanProxy(server, 
       HOTSPOT_BEAN_NAME, clazz); 
      return bean; 
     } catch (RuntimeException re) { 
      throw re; 
     } catch (Exception exp) { 
      throw new RuntimeException(exp); 
     } 
    } 

    public static void main(String[] args) { 
     // default heap dump file name 
     String fileName = "D:\\heap.bin"; 
     // by default dump only the live objects 
     boolean live = true; 

     // simple command line options 
     switch (args.length) { 
      case 2: 
       live = args[1].equals("true"); 
      case 1: 
       fileName = args[0]; 
     } 

     // dump the heap 
     dumpHeap(fileName, live); 
    } 
} 
+2

java7 kullanıyorum. Sorun, HotSpotDiagnosticMXBean'ın bir public HotSpotDiagnosticMXBean sınıfı olmamasıdır (jdk'nin bir parçası değildir). Bu sınıf sadece Oracle java dağılımında bulunur, JVM bağımlıdır. – Chriss

+0

Bu, özelliğin JVM'ye bağlı olduğu ve kodu derleyebileceğiniz anlamına gelir, ancak bu özelliği desteklemeyen JVM'lerde çalışmayabilir. Hangi JVM'leri kullanıyorsunuz? –

0

Sen farklı bir konuma HotSpotDiagnosticMXBean.class sahip rt.jar kopyalayabilirsiniz: Yansıma kullanarak kısıtlama atlayabilir gibi Tamam