Çekirdekleri yönetmek için Java platformunu kullanın

Java SE 5.0 uygulamalarını izleme

Java 2 platform sürüm 5.0 tarafından sunulan birçok yeni özellik arasında, Java uygulamalarına izin veren ve araçların Java Sanal Makinesi'ni (JVM) ve sanal makinenin bulunduğu yerel işletim sistemini izlemesine ve yönetmesine izin veren bir API vardır. Bu makalede, java.lang.management paketinde bulunan bu yeni platform yönetimi API'sinin işlevlerini öğreneceksiniz. Bu makale, Java platformunun gelecekteki sürümlerinde daha önemli hale gelecek bir dizi yeni güçlü özelliği hızlı bir şekilde kavramanıza olanak sağlayacaktır.

5.0 sanal makineyi izleyin ve yönetin

Java 5.0, çalışan sanal makineleri izlemek ve yönetmek için yeni işlevler sağlar. Geliştiriciler ve sistem yöneticileri 5.0 sanal makinenin performansını izleyebilir ve ayrıca belirli öznitelikleri ayarlayabilir. Java Yönetim Uzantıları'nı (JMX) kullanarak daha önce deneyimi olan herkes, bu etkinlikleri gerçekleştirme mekanizmalarına aşina olacaktır. JMX teknolojisi sayesinde, kontrol edilmesi gereken bir dizi platform kaynağı basit, iyi tanımlanmış nesneler olarak ele alınabilir ve nesnelerin öznitelikleri, belirli bir kaynağın alt düzey özellikleriyle eşleştirilebilir.

Platform yönetimi API'sinde, bu iyi tanımlanmış nesnelere MXBeans adı verilir. MXBean'in daha tanıdık olabilecek bir tür MBean gibi geldiğini düşünüyorsanız, haklısınız. Aslında, bu MXBeans (veya platform MBean'leri) 5.0 platformunun belirli bölümlerini kapsayan yönetilen çekirdeklerdir. Şekil 1, MXBeans'in daha büyük sistemdeki konumunu göstermektedir:

Şekil 1. MXBean, Java platformunun yönetim arayüzünü sağlar

Çalışan 5.0 uyumlu bir sanal makinede birçok farklı işlev türü bulunabilir ve özelleştirilebilir; örneğin, kullandığınız JIT sisteminin davranış ayrıntılarını veya çöp toplama hizmetlerinin ilerlemesini alabilirsiniz.

Herhangi bir Java uygulaması, gerekli fasulye referanslarını elde ettiği sürece (bu makalede açıklanan teknikleri kullanarak) platform çekirdeklerinden yararlanabilir ve ardından uygun yöntem çağrılarını çağırabilir. En basit senaryoda, fasulye müşterisi, müşterinin bulunduğu platformla ilgili bilgileri keşfedebilir. Ancak müşteri, tamamen bağımsız bir JVM'nin davranışını da izleyebilir. Bu mümkündür çünkü MXBean, Java 5.0'da bulunan standart JMX hizmetlerini kullanarak uzaktan yönetilebilen bir MBean türüdür.

JConsole

Bean istemcisine bir örnek, Java SE 5.0 SDK ile sağlanan JConsole aracıdır. Bu, JVM'ye bağlanan ve JVM bilgilerini görüntüleyen bir grafik arabirimdir. GUI'deki sekmeler, JVM'nin belirli yönleriyle ilgilidir; Bellek, İş Parçacıkları ve Sınıflar gibi sekmeler vardır. JConsole aracı ayrıca genel bir Özet sekmesi, bir VM sekmesi (sanal makine başlatıldığında ortam bilgisi sağlar) ve bir MBean sekmesi (kullanıcılar bunu platform MBean'lerinin durumunu daha ayrıntılı olarak izlemek için kullanabilir) sağlar.

JConsole'u çalıştırın

JConsole'u başlatmak için komut istemine jconsole girin (SDK'nın bin dizininin geçerli yolda olduğu varsayılarak). Lütfen izlenecek JVM'nin ana bilgisayar adını ve yönetim isteklerini dinleyen bağlantı noktası numarasını ve diğer gerekli kimlik doğrulama ayrıntılarını girin ve tıklayın Bağlan . Localhost ve port 0 varsayılan değerlerine tıklayın Bağlan , İzleme JConsole'nin kendi JVM'sini çalıştırmak için kullanılır (çünkü JConsole bir Java işlemidir). Buna kendi kendini izleme modu denir. Şekil 2, JConsole'un başlatılmasını göstermektedir:

Şekil 2. JConsole başlangıcı

JConsole iş başında

JVM ile bağlantı kurulduktan sonra, JConsole ilk olarak Şekil 3'te gösterildiği gibi Özet sekmesini görüntüler:

Şekil 3. JConsole'un Özet sekmesi

Buradan diğer sekmeleri seçebilirsiniz. Örneğin, Şekil 4'te gösterildiği gibi Bellek sekmesi, JVM'deki her bir bellek havuzunun kullanım geçmişini gösterir:

Şekil 4. JConsole'un Bellek sekmesi

Lütfen dikkat edin GC gerçekleştir Buton. Bu, MBeans platformu kullanılarak JVM üzerinde gerçekleştirilebilecek birçok işlemin bir örneğidir.

Çalışma şekli

Şimdiye kadar okunan temel içerik, yönetilen çekirdek veya MBean kavramıdır. MBean'leri kaynak yönetimi arayüzünün programlanabilir temsili olarak düşünebilirsiniz. Daha basit bir ifadeyle, onları kontrollü varlıkların etrafındaki Java sarmalayıcıları olarak düşünebilirsiniz. Daha pratik bir ifadeyle, MBean'ler Java sınıflarıdır.Bu sınıfların genel yöntemleri, iyi tanımlanmış bir kurallar dizisine göre yazılır; bu kurallar, yönetilen uygulamanın veya kaynağın özelliklerinin tamamen kapsüllenmesini gerektirir. Son olarak, kaynakların yöneticileri (ağın neresinde olurlarsa olsunlar) kontrol amacıyla ilgili MBean'leri bulur ve kullanır.

API aracılığıyla, MBean, Şekil 5'te gösterildiği gibi aşağıdaki bilgileri sağlar:

  • Kaynağın öznitelikleri tarafından sağlanan kaynağın mevcut durumu
  • Yönetim aracısının kaynak üzerinde gerçekleştirebileceği işlemler
  • İlgili ortaklara gönderilebilecek olası olay bildirimleri

Şekil 5. MBean istemcisi öznitelikleri, işlemleri ve olayları kullanır

MBean oluşturulduktan sonra MBean sunucusuna kaydedilmesi gerekir. MBean sunucusu olarak hareket etmenin yanı sıra, MBean sunucusu ayrıca yönetim sisteminin kayıtlı MBean'leri keşfetmesi ve kullanması için bir yol sağlar. Kayıtlı MBean'ları yönetmenin ek işlevleri JMX proxy hizmeti tarafından gerçekleştirilir. Bu hizmetler şunları içerir: MBean'lerin öznitelik değerlerini izleme, ilgili ortakları MBean değişiklikleri hakkında bilgilendirme, dinleyicilere MBean'ler hakkındaki belirli bilgileri periyodik olarak bildirme ve MBean'ler arasındaki ilişkiyi sürdürme. JMX'in proxy hizmeti genellikle MBean'ın kendisidir.

MBean sunucusu ile gerekli JMX proxy hizmetinin birleşimi, Şekil 6'da gösterildiği gibi JMX proxy olarak adlandırılır:

Şekil 6. JMX proxy

JMX aracısı, yönetilen kaynaklarını - yani şu anda MBean sunucusuna kayıtlı MBean kümesini - diğer uzak aracılar için kullanılabilir hale getirebilir.

Java 5.0 sürümünden önce javax.management API, Java platformunun isteğe bağlı bir uzantısıydı.Kullanıcılar bunu bağımsız bir indirme yoluyla edinebilir ve Java kodu aracılığıyla kaynakları yönetmek ve izlemek için kullanabilirler. Bu bağlamda kaynaklar, uygulamalar, kritik iş uygulamaları çalıştıran J2EE sunucuları, düz eski Java nesneleri (POJO'lar) veya hatta donanım varlıkları (ağ ekipmanı, set üstü kutular, telekomünikasyon ekipmanı veya benzeri) olabilir. Bir kaynak Java kodundan referans alınabiliyorsa, bu durumda potansiyel olarak yönetilen bir kaynak olabilir.

Burada aslında sadece JMX'in yüzeyine dahil olsak da, MXBean'i anlamak için giriş yeterli oldu. JMX'in tasarımı ve işlevselliği hakkında kapsamlı bir tartışma bu makalenin kapsamı dışındadır. Ağ yönetimi uygulamalarında JMX'in sorumlu olduğu işlev kısmına mükemmel bir genel bakış için Sing Li'nin bu konudaki serisini okuyabilirsiniz (bkz. Kaynaklar).

MXBean nedir? Bunları nasıl kullanacaksınız?

Artık MBean'lerin ne olduğunu bildiğinize göre, artık java.lang.management paketinde tanımlanan benzer adlara sahip MXBeans'e bakabilirsiniz. İyi haber şu ki: MXBeans, MBean'leri tartışırken ortaya koyduğumuz kavramlardan sapmıyor. Bu paketteki türlerin çoğu, adlandırma kurallarına uyan arabirimlerdir.Adlandırma kuralları, standart MBean'ler tarafından kullanılanlara benzer: platform kaynağının adı artı MXBean soneki. (Standart MBean'ler için elbette MBean sonekini kullanın.)

Tablo 1, java.lang.management paketinde sağlanan MXBean arabirimi aracılığıyla kullanılabilen platform kaynaklarını açıklar:

Tablo 1. MBean'ler aracılığıyla yönetilebilen platform kaynakları

Platform kaynaklarına karşılık gelen mevcut MXBeans sayısı Derleme CompilationMXBean 0 veya 1 çöp toplama sistemi GarbageCollectorMXBean en az 1 bellek MemoryMXBean tam olarak 1 bellek yöneticisi MemoryManagerMXBean en az 1 thread ThreadMXBean tam olarak 1 işletim sistemi OperatingSystemMXBean tam olarak 1 çalışma zamanı sistemi RuntimeMXBean tam olarak 1 sınıf yükleme sistemi ClassMXBean tam olarak 1 bellek kaynağı MemoryPool En az 1

Her bir MXBean için, müşterinin programlaması gereken arayüz, Java 5.0 spesifikasyonunda kesin olarak ayarlanmıştır. Şu anda, müşteriler böyle bir arayüzü özelleştiremezler, yani platformun daha yönetilebilir niteliklerini ortaya çıkarır.

Tablo 1'in üçüncü sütununda gösterilen her bir MXBean türünün olası örnek sayısı, büyük ölçüde yönetilmekte olan belirli platform sistemine bağlıdır. Örneğin, JVM spesifikasyonu, uygulayıcıların kullanacakları çöp toplama algoritmasını seçmelerine izin verse de, herhangi bir sayıda çöp toplayıcı kullanmak için nedenler vardır, bu nedenle herhangi bir zamanda herhangi bir sayıda GarbageCollectionMXBean örneği etkin olacaktır. Lütfen bunu, yalnızca bir örneği olan OperatingSystemMXBean ile karşılaştırın, çünkü yönetilen sanal makine belli bir zamanda yalnızca bir işletim sisteminde çalışabilir.

İstemci kodu, tek seferlik MXBean'i sanal makinede gerçek bir single olarak güvenle ele alabilir. Herhangi bir zamanda, referans talebi bu tek seferlik tiplerde olduğu sürece, referans talebinin nereden geldiği veya sanal makine yaşam döngüsünde ne zaman gerçekleştiği önemli değil, cevap her zaman aynı örnektir. Bu, birden çok istemci bir sanal makineyi izlediğinde bile geçerlidir.

MBeanServerConnection

Javax.management.MBeanServerConnection arabirimi, javax.management.MBeanServer arabiriminin süper tipidir. MBean sunucusu ve istemci kodu aynı JVM'de çalışıyorsa (yani, yönetim istemcisi ve JMX aracısı aynı sanal makinedeyse), şunları yapabilirsiniz: Bu arayüz MBean sunucusunu çağırır. MBeanServerConnection ve MBeanServer arasında bir ebeveyn-çocuk ilişkisi olduğundan, istemciler uzak veya yerel MBean sunucularıyla etkileşimde bulunmak için aynı yöntem çağrılarını kullanabilir.

Java istemci koduna göre, MXBean örneği herhangi bir POJO gibi davranır. Nesne, diğer katılımcılar olmadan bilgi almak için doğrudan çağrılabilir. Elbette, bu durum Java istemcisinin doğrudan yerel çekirdeğe bir referans almasını (yönetim uygulamasıyla aynı sanal makinede çalışan) veya uzak sanal makineyi kapsülleyen çekirdek için bir proxy talep etmesini gerektirir. Her iki durumda da referans, platformun monolitik ManagementFactory'sinden alınır.

Platform çekirdeklerine javax.management.MBeanServerConnection aracılığıyla erişmek de mümkündür, ancak bu durumda oturumda fazladan bir yönlendirme seviyesi vardır. Platform sunucusu aracılığıyla uzak sanal makineleri izleme bölümünde göreceğiniz gibi, bu senaryoda, istemci her zaman MBeanServerConnection'dan belirtilen uzak çekirdeği kendi adına bulmasını ve aramayı yapmasını ister. Bu aslında JMX'in (daha önce bahsedilmiştir) uzaktaki MBean'lere çağrı yapmasına izin verir ve uzak istemcinin MBean'ın kayıtlı olduğu MBean sunucusu ile iletişim kurması gerekir.

MXBean, JavaBean değildir

Karışıklığı önlemek için şunu hatırlamak gerekir: MXBean'i JVM'yi izlemeye ve kontrol etmeye yardımcı olan bir MBean olarak düşünmek tamamen doğru olsa da, MXBean'i bir tür JavaBean olarak düşünmek kesinlikle yanlıştır. JavaBean teknolojisi, Java platformunun bileşen modelidir ve tasarım amacı, grafik araçlarla yeniden kullanılabilir Java bileşenlerinden uygulamalar oluşturma becerisi sağlamaktır. JavaBean'ın bazı özelliklerinin (araçların öznitelikleri bulmasına yardımcı olmak için anlamlı adlandırma kurallarının kullanılması gibi) hem MBean hem de MXBean alanlarında mevcut olmasına rağmen, iki teknoloji tamamen farklıdır, bu yüzden onları karıştırmayın.

Ek MXBean

Bu makalenin başında java.lang.management paketinin platform yönetimi API'sini içerdiğinden bahsetmiştik. Şimdi, bu cümleye ufak bir düzeltme yapalım, çünkü tüm MXBeans bu pakete dahil değildir. LoggingMXBean, Java platformunun günlüğe kaydetme işlevine çok sıkı bir şekilde bağlı olduğundan, onu java.util.logging paketine koymak daha mantıklıdır. Adından da anlaşılacağı gibi, bu tür MXBean, çalışan sanal makinelerin günlük işlevi için bir yönetim arabirimi sağlar. Müşteri, bu çekirdeğin referansını kullanarak platforma kayıtlı tüm kaydedicilerin adlarını ve bunların birbirleriyle olan ilişkilerini edinebilir. Ayrıca, belirtilen platformun günlük programı düzeyini alabilir ve ayarlayabilirsiniz.

OperatingSystemMXBean ve ThreadMXBean (diğer iki örnek) gibi, LoggingMXBean de çalışan sanal makinede tek bir birim olarak var. Genel özelliklerinin herhangi bir girişi ve kümesi, herhangi bir iletişim yöntemi aracılığıyla olursa olsun, nihayet aynı nesne örneğine yönlendirilir.

MXBean'i alın

İstemci kodunun MXBeans'e erişmesinin üç yolu vardır: fabrika yöntemi aracılığıyla, platform sunucusu aracılığıyla veya proxy olarak.

Fabrika yöntemi

MXBeans'i almanın en kolay yolu, java.lang.management.ManagementFactory sınıfı tarafından sağlanan statik yöntemleri kullanmaktır. Ancak bu şekilde elde edilen MXBean yalnızca yerel sanal makineyi izlemek için kullanılabilir. ManagementFactory sınıfı, her MXBean için bir alma yöntemi tanımlar. Bazı yöntemler tek bir MXBean örneği döndürür ve bazı yöntemler güçlü bir şekilde yazılmış MXBean örnekleri Listesi döndürür.

Belirtilen türde yalnızca bir MXBean olduğunda, onu geri almak için kod basittir. Liste 1, ThreadMXBean'ı almak için kodu gösterir:

Liste 1. Platformun benzersiz ThreadMXBean referansını alın

ThreadMXBean threadBean = ManagementFactory.getThreadMXBean ();

Birden çok MXBean örneğine sahip olabilecek MXBean türleri için Liste 2'de gösterildiği gibi Listedeki MXBeans'i döndürebilen fabrika yöntemleri vardır:

Liste 2. Platformdaki bilinen tüm MemoryPoolMXBeans'lerin kesin yazılmış listesini alın

Liste < Bellek HavuzuMXBean > memPoolBeans = ManagementFactory.getMemoryPoolMXBeans (); (MemoryPoolMXBean mpb: memPoolBeans) {için System.out.println ("Bellek Havuzu:" + mpb.getName ()); }

LoggingMXBean, java.util.logging paketinin bir parçasıdır, bu nedenle Liste 3'te gösterildiği gibi, erişmek için ManagementFactory sınıfı yerine LogManager sınıfını kullanın:

Listeleme 3. LogManager'dan LoggingMXBean referansını alın

LoggingMXBean logBean = LogManager.getLoggingMXBean ();

Unutmayın, bu yöntemler yalnızca yerel sanal makineye ait MXBeans'e erişime izin verir. İstemci kodunu aynı makinedeki veya farklı düğümlerdeki uzak JVM'leri birlikte işleyebilecek şekilde genişletmek istiyorsanız, aşağıda açıklanan iki yöntemden birini kullanmanız gerekir.

Platform sunucusu aracılığıyla

Uzak sanal makinenin MBean sunucusunun bağlantısını aramak için kodu organize etmek uygun bir seçenektir. Bu seçimi başarılı kılmak için önce uzak sanal makineyi tuş komut satırı seçenekleriyle başlatmanız gerekir. Bu seçenekler, sanal makinenin ilgili JMX proxy'sinin istekleri dinlediği bağlantı noktasını ve geçerli güvenlik düzeyini ayarlar. Örneğin, aşağıdaki seçeneklerle başlatılan bir sanal makine için proxy'si 1234 numaralı bağlantı noktasını dinler ve güvenlik yoktur:

-Dcom.sun.management.jmxremote.port = 1234 -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false

Bu makalenin sonraki bölümlerinde yer alan güvenlik bölümü, sanal makinelere güvenli erişimi tanıtacaktır.

Uzaktan proxy dinleme ile, ilgili MBean sunucu bağlantısına bir referans almak için Liste 4'teki kod parçacığını kullanabilirsiniz:

Liste 4. Farklı sanal makinelerin MBean sunucularını bağlamak için JMXConnectorFactory'yi kullanma

Deneyin { // JMX RMI işlevini kullanarak ayrı bir sanal makinenin MBeanServer'ına bağlanın JMXServiceURL adresi = yeni JMXServiceURL ("hizmet: jmx: rmi: /// jndi / rmi: // localhost: 1234 / jmxrmi"); JMXConnector konektörü = JMXConnectorFactory.connect (adres); MBeanServerConnection mbs = connector.getMBeanServerConnection (); } tutmak ...

MBeanServerConnection bir kez alındığında, JMX yöntemleri getAttribute (), setAttribute () ve invoke (), MXBean'i işlemek için kullanılabilir. Bu, platform sunucusu aracılığıyla uzak sanal makineleri izleme bölümünde açıklanacaktır.

Bir ajan olarak

Platform bean API'sine erişmenin üçüncü yöntemi, daha önce açıklanan iki yöntemle ortak bir noktaya sahiptir. Daha önce olduğu gibi, izlenen sanal makinenin JMX aracısının MBeanServerConnection öğesinin alınması gerekir. Ardından, ManagementFactory sınıfının statik yardımcı yöntemini kullanarak, istemci kodu uzak sanal makinenin MBean sunucusunda kayıtlı belirtilen MXBean'in bir proxy örneğini talep edebilir. Liste 5 bir örnek gösterir:

Liste 5. Uzak bir MBean sunucusuna yapılan bir referans, uzak MXBean için bir proxy

Deneyin { ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy (mbs, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); } tutmak ...

Tüm tekli MXBeans'ler için (LoggingMXBean hariç), sunucu kaydı için kullanılan tam dize adı ManagementFactory sınıfının genel statik alanında elde edilebilir. Örneğin, ThreadMXBean'ın javax.management.ObjectName dize temsili THREAD_MXBEAN_NAME alanında saklanırken, LoggingMXBean'ın kayıtlı adı java.util.logging.LogManager sınıfının statik alanında saklanır. Liste 6, LoggingMXBean proxy örneği için isteği gösterir:

Liste 6. LoggingMXBean'ın dize adı java.util.logging.LogManager sınıfının bir sabitidir.

Deneyin { LoggingMXBean logBean = ManagementFactory.newPlatformMXBeanProxy (mbs, LogManager.LOGGING_MXBEAN_NAME, LoggingMXBean.class); } tutmak ...

Sanal makinede birden fazla örneğe sahip olabilecek MXBean türleri için işler biraz daha sorunlu hale gelir. Bu durumda, belirtilen türdeki tüm kayıtlı MXBeans adlarını almak için önce MBeanServerConnection'ı kullanmanız gerekir. Kolaylık sağlamak için, her bir MXBean'in NesneAdı'nın etki alanı bölümü, ManagementFactory'deki genel bir statik alanda saklanır. Bu adlar alındıktan sonra, her ad, ayrı bir proxy örneği oluşturmak için kullanılabilir. Liste 7 bir örnek göstermektedir:

Liste 7. Uzak sanal makineye ait her MemoryManagerMXBean için proxy oluşturun

Deneyin { // Sunucudaki tüm Bellek Yöneticisi MXBeans adlarını alın SrvMemMgrNames = mbs.queryNames (yeni NesneAdı ( ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE + ", *"), null); // Döndürülen her ad için bir MXBean Proxy alın for (Object memMgrName: srvMemMgrNames) { // Nesneyi bir ObjectName'e Yayınlama NesneAdı memMgr = (NesneAdı) memMgrName; // tam nesne adıyla newPlatformMXBeanProxy'yi çağırın // belirli MXBean için MemoryManagerMXBean memMgrBean = ManagementFactory.newPlatformMXBeanProxy ( mbs, memMgr.toString (), MemoryManagerMXBean.class); // memMgrBean uzak MXBean için bir proxy'dir. Kullanabiliriz // sanki yerel bir MXBean'e referansmış gibi. System.out.println ("Bellek Yöneticisi Adı =" + memMgrBean.getName ()); } } tutmak ...

MXBean kullanın

Java.lang.management belgesi, her MXBean arayüzü tarafından tanımlanan işlemleri listeler. Bu işlemler sayesinde kullanıcılar sanal makineleri yönetebilir ve izleyebilir. Örneğin, MemoryMXBean üzerindeki işlemler bellek sisteminin ayrıntılı çıktısını açmaya, çöp toplama talebinde bulunmaya ve geçerli yığın ve yığın olmayan bellek havuzu tarafından kullanılan bellek hakkında ayrıntılı bilgi almaya izin verir. Bu nedenle, bir Java uygulaması tarafından kullanılan bellek miktarı konusunda endişeleriniz varsa veya öbek boyutunu ayarlamak istiyorsanız, java.lang.management API ile kolayca bir yönetim istemcisi yazabilir, uygulamaya bağlanabilir ve bellek kullanımını izleyebilirsiniz.

Benzer şekilde, ThreadMXBean ayrıca bir Java uygulaması askıya alındığında yararlı işlevler sağlar. FindMonitorDeadlockedThreads () yöntemi, kendisi tarafından kilitlenmiş olarak tanımlanan iş parçacığının kimliğini döndürür. Bu kimlikler daha sonra yığın izleri, durumları, yerel kodu çalıştırıp çalıştırmadıkları vb. Dahil olmak üzere iş parçacıkları hakkında ayrıntılı bilgi almak için kullanılabilir.

Bu iş parçacığı bilgileri, ThreadInfo sınıfının bir örneğinde sağlanır. Bu sınıf, java.lang yönetim paketi tarafından sağlanan üç sınıftan biridir ve kullanıcıya veri anlık görüntülerini döndürmek için MXBean tarafından kullanılır; diğer ikisi MemoryUsage ve MemoryNotificationInfo sınıflarıdır . Bu üç sınıfın her biri, belirli bir platformun doğasını açıklamak için kullanılan yapılandırılmış bilgileri içeren karmaşık bir veri türüdür.

Şimdi, yukarıda tartışılan kavramların Java koduna nasıl dönüştürülebileceğini göstermek için iki örnek senaryoya bakın.

Örnek 1: Sanal makineyi MXBean veya aracı aracılığıyla izleme

Daha önce tartışıldığı gibi, MXBean'in yöntemleri doğrudan yerel MXBean üzerinden veya bir proxy aracılığıyla çağrılabilir. Liste 8, ThreadMXBean'in alıcı ve ayarlayıcı işlemlerinin nasıl kullanılacağını gösterir. Bu örnekteki threadBean değişkeni yerel sanal makineden alınan MXBean veya uzak sanal makineden alınan MXBean proxy'si olabilir. Referans elde edildiğinde, arayana şeffaftır.

Liste 8. ThreadMXBean değerini alın ve ayarlayın

Deneyin { // JVM için geçerli iş parçacığı sayısını alın int threadCount = threadBean.getThreadCount (); System.out.println ("Thread Count =" + threadCount); // iş parçacığı CPU zamanını etkinleştir threadBean.setThreadCpuTimeEnabled (true); } tutmak ...

Liste 8'de kullanılan setThreadCpuTimeEnabled () yöntemi isteğe bağlı olarak 5.0 uyumlu sanal makinelerde desteklenir. Liste 9'da gösterilen isteğe bağlı özellikleri kullanırken şunları kontrol etmeniz gerekir:

Liste 9. İsteğe bağlı öznitelikleri kullanmaya çalışmadan önce, isteğe bağlı özniteliklerin desteklenip desteklenmediğini kontrol edin

if (threadBean.isThreadCpuTimeSupported ()) { threadBean.setThreadCpuTimeEnabled (true); }

CompilationMXBean türünün getTotalCompilationTime () yöntemi, her 5.0 uyumlu sanal makine uygulamasında gerekli olmayan işlevleri de içerir. Liste 9'daki setThreadCpuTimeEnabled () gibi, desteğin olup olmadığını kontrol etmek için ilgili yöntemler vardır. Bu algılama yöntemlerini kullanmayan kodun, isteğe bağlı yöntemin oluşturabileceği herhangi bir java.lang.UnsupportedOperationException öğesini işlemesi gerekir.

Liste 10, sanal makinede çalışan tüm iş parçacıkları hakkındaki bilgilere nasıl erişileceğini gösterir. Her iş parçacığının bilgisi, daha sonra sorgulanabilen ayrı bir özel ThreadInfo nesnesinde saklanır.

Liste 10. Sanal makinede çalışan tüm iş parçacıklarının adlarını alın

Deneyin { // Mevcut tüm konuların kimliklerini alın uzun threadIDs = threadBean.getAllThreadIds (); // Her threadID için ThreadInfo nesnesini alın ThreadInfo threadDataset = threadBean.getThreadInfo (threadID'ler); for (ThreadInfo threadData: threadDataset) { eğer (threadData! = null) { System.out.println (threadData.getThreadName ()); } } } tutmak ...

Unutmayın, ThreadInfo, MemoryUsage ve MemoryNotificationInfo gibi karmaşık türlerde bulunan bilgiler, çağrının istendiği anda sistemin sadece bir anlık görüntüsüdür. Bu nesneler, referans aldıktan sonra dinamik olarak güncellenmeyecektir. Bu nedenle, uygulamanın yönetilen sanal makinedeki verilerin bu yönlerini yenilemesi gerekiyorsa, güncellenmiş ThreadInfo veya MemoryUsage nesnesini almak için başka bir çağrı yapması gerekir. MemoryNotificationInfo nesneleri bu açıdan biraz farklıdır, çünkü bunlar yönetim uygulaması tarafından çekilmezler, ancak olay bildirimlerinde yükseltilirler (bu, yakında ayrıntılı olarak tartışılacaktır).

Örnek 2: Platform sunucusu aracılığıyla uzak sanal makineleri izleme

Uzak bir JVM'nin ThreadMXBean'ine erişmek için MBeanServerConnection'ı kullanmak Liste 1'deki örnek kadar kolay değildir. İlk olarak, ThreadMXBean'ın bir javax.management.ObjectName örneği gereklidir. Bu örneği, Liste 11'de gösterildiği gibi MXBean proxy nesnesiyle aynı adla oluşturabilirsiniz:

Listeleme 11. ThreadMXBean Nesne Adının Oluşturulması

Deneyin { ObjectName srvThrdName = new ObjectName (ManagementFactory.THREAD_MXBEAN_NAME); ... } tutmak ...

Liste 12'de gösterildiği gibi, MBeanServerConnection'ın getAttribute (), setAttribute () ve invoke () işlevini çağırmak için belirli uzak ThreadMXBeans örneklerini tanımlamak için ObjectName örneklerini kullanabilirsiniz:

Liste 12. Uzak MBean sunucusuna yapılan çağrılar için NesneAdı kullanın

Deneyin { // JVM için geçerli iş parçacığı sayısını alın int threadCount = ((Tamsayı) mbs.getAttribute (srvThrdName, "ThreadCount")). intValue (); System.out.println ("Thread Count =" + threadCount); desteklenen boole = ((Boolean) mbs.getAttribute (srvThrdName, "ThreadCpuTimeSupported")). booleanValue (); eğer (destekleniyor) { mbs.setAttribute (srvThrdName, new Attribute ("ThreadCpuTimeEnabled", Boolean.TRUE)); ... } } tutmak ...

Liste 13, MBean sunucu bağlantısı aracılığıyla sanal makinedeki tüm mevcut iş parçacıklarına erişimi gösterir. Bu şekilde erişilen MXBean, JMX açık türlere sarılmış karmaşık veri türlerini döndürür - örneğin, javax.management.openmbean.CompositeData nesneleri.

Karmaşık verileri neden ara türlerde sarmalıyorsunuz? Unutmayın, MXBeans, gerçekte Java dilinde yazılmayan uzak uygulamalar tarafından yönetilebilir veya yönetilen kaynakların farklı özelliklerini tanımlamak için kullanılan tüm karmaşık türlere erişemeyen bu tür Java uygulamaları tarafından yönetilebilir. JMX proxy platformuna olan bağlantının her iki ucunun da basit türleri (boolean, long ve string gibi) anlayabildiğini ve ayrıca ilgili uygulama dillerinde karşılık gelen türlerle eşleştirilebileceğini varsaymak güvenli olsa da, her birinin mümkün olduğu varsayılır. Yönetim uygulamaları, gerçekçi olmayan ThreadInfo veya MemoryUsage gibi karmaşık türleri doğru şekilde yorumlayabilir. CompositeData gibi açık türler, karmaşık (yani, temel olmayan veya yapılandırılmış) verileri temsil etmek için daha temel türleri kullanabilir.

5.0 MXBean'in uzaktan çağrısı, karmaşık bir tip örneğinin aktarılmasını gerektiriyorsa, nesne eşdeğer bir CompositeData'ya dönüştürülür. Bu, bilginin mümkün olan en geniş müşteri yelpazesine gönderilmesine izin verse de, dezavantajları vardır: aslında, ThreadInfo ve MemoryUsage türlerini ayrıştırabilen alıcı Java uygulamasının hala açık türlerden karmaşık türlere dönüştürülmesi gerekir. Ancak öyle olsa bile, çok zahmetli değildir, çünkü java.lang.management içinde tanımlanan tüm desteklenen karmaşık veri türleri bunu yapmak için statik kolaylık yöntemlerine sahiptir.

Liste 13'te, threadDataset niteliği doğrudan ThreadInfo nesnelerine eşlenen bir dizi CompositeData nesnesi içerir. Her iş parçacığı için, ThreadInfo () öğesinin statik yöntemi, CompositeData'dan eşdeğer bir ThreadInfo nesnesi oluşturmak için kullanılır. Her iş parçacığı hakkındaki bilgilere erişmek için bu nesneyi kullanabilirsiniz.

Listeleme 13. CompositeData türü ağ üzerindeki karmaşık veri yapılarını iletir

Deneyin { // Mevcut tüm konuların kimliklerini alın long threadIDs = (long) mbs.getAttribute (srvThrdName, "AllThreadIds"); // Her iş parçacığı kimliği için ThreadInfo nesnesini alın. Bunu yapmak için // uzak iş parçacığı çekirdeğinde getThreadInfo yöntemini çağırın. // birlikte çalıştırmak için yöntemin adını iletmemiz gerektiğini // argüman ve argüman türü. Bildiğimiz oldukça çirkin. CompositeData threadDataset = (CompositeData) (mbs.invoke (srvThrdName, "getThreadInfo", yeni Nesne {threadIDs}, new String {"
China Orient: Şirketin yüksek kaliteli kalkınma elde etmesini teşvik etmek için ana faaliyet göstermeyen varlıkların ana işini güçlendirmek ve optimize etmek
önceki
Satış ve satın almalarda emlak piyasası kısıtlamalarının iki yükseltmesi, Suzhou, düzenlemeyi artırmak için iki ayda 4 kez
Sonraki
Java teorisi ve pratiği, engellemeyen algoritmalara giriş
Net balık tutma ve suda oynama
Dağıtım verimliliğini etkili bir şekilde artırmak için Ant ve Eclipse kullanın
Tayfun "Weipa" Qinzhou'yu etkiliyor, vatandaşlar kuvvetli rüzgarlarda ve sağanaklarda seyahat ediyor
Yurtdışında okumaya değer mi? `` 2019 Yurtdışı Öğrencilerinin Üstün Yetenek Talep Raporu '' size anlatıyor
90 günlük rapora ek olarak, Tayland'daki yabancıların 24 saat içinde rapor vermesi gerektiğini biliyor musunuz?
Geceleri kutsal nilüferle boyanmış, ağır makyaj her zaman uygundur
Sadece "Çin Restoranı" nı izledikten sonra Tayland'daki bu güzel adayı tanıdım! Elephant Island'a ilk gelişim
"Yuwei" tayfunu hala Guangxi, Yunnan'ı rahatsız ediyor ve Kuzeybatı Çin'de şiddetli yağmur "yelken açıyor"
Northern Light Venture Capital Zhang Peng: Yatırımcılarla nasıl etkili bir şekilde iletişim kurulabilir? | E-Club Maker Club kapalı kapılar ardında paylaştı
İlk kez yörüngeye fırlatıldı! Çin'in özel roketleri sıfır atılım elde etti | Özel ticari havacılık büyük değişiklikler görecek mi
Tayland'a seyahat etmenin maliyeti nedir? Uçak bileti, konaklama ve yemek sizin için
To Top