Java szer szolgálatában JVM


Valószínűleg sokan hallottak vagy tapasztaltak ilyen paraméter a JVM -javaagent, látja ezt a lehetőséget, akkor Jrebel Plumbr vagy lehetett kinézni JAVA_OPTS = -javaagent: [path / to /] jrebel.jar vagy úgy -javaagent: / path-to /plumbr.jar
Bár javaagent megjelent a Java verziót 1.5, sok fejlesztő még nem használta a lehetőséget, ügynökök, és egy homályos elképzelés, mi az.
Milyen ügynök? Miért tudja mi lesz szükség és hogyan kell írni a?

Mint korábban írtam javaagent egyik JVM paraméterek, amely lehetővé teszi, hogy meghatározza egy ügynök, aki fut az alkalmazás, inkább fog futni, mielőtt futtatni az alkalmazást. maga az ügynök egy önálló alkalmazás, amely hozzáférést biztosít a mechanizmus manipuláció bytecode (java.lang.instrument) futási időben. Ez dióhéjban. Hivatalos dokumentáció itt olvasható. de ez elég szegényes. Bármi tisztázott? Úgyhogy foglalkozik. A legjobb, hogy megértsék a példát.

Írunk az elemi szer

Felhívjuk figyelmét, hogy az ügynök végre kell hajtania egy eljárást a következő aláírás premain
public static void premain (String args);
vagy
public static void premain (String args, hangszerelés inst);

Class szert kell csomagolni egy korsó és tartalmaznia manifest.mf. kötelező attribútum
PreMain-osztály - jelzi egy osztály ügynök premain módszerrel. Vannak más attribútumok a szer, de nem kötelező, és most már nem kell.

Így nézzük manifest.mf.
ne felejtsük el, hogy adjunk egy újsor a fájl végén

Most csomagolja az egészet egy korsó

Végül az osztály teszt

AgentTester fut a parancssorból

Ez a példa azt mutatja, hogy:
  • premain eljárás végre, mielőtt hívja a fő fő alkalmazása.
  • hatóanyag alkalmazása javallott a paraméter -javaagent: jarpath [= opciók]

Próbáljunk tanulni a szer bármely alkalmazásáról


Általában, ügynökök mechanizmus bytecode manipuláció. De módosítani fogja a byte-kódot ebben a cikkben fogjuk egyébként nem kell messzire menni, messze túl a post. Ki érdekel nézd meg javassist, mint a standard eszközök dolgozó bytecode nem.

Írjunk AgentCounter amely megjeleníti a nevét a betöltött osztály és számolja meg a betöltött osztályok. Így lesz képes betartani a munka classloader`a.


Felhívjuk figyelmét, hogy most más módszert alkalmaznak aláírás premain. A műszerek tárgy átadom ClassTransformer aki elvégzi a munkát. ClassTransformer indul minden alkalommal az osztály betöltésekor. Ha szeretné használni a ClassTransformer, akkor végre kell hajtania java.lang.instrument.ClassFileTransformer felület és adjuk hozzá a tárgy, az eljárás révén Instrumentation.addTransformer


classfileBuffer - ez a byte-kódot a jelenlegi osztály képviselteti magát egy byte tömböt, az ő újradefiniálása transzformátor vissza kell egy új tömböt bájtok, ebben a példában nem változtatunk a tartalmát az osztály, így csak vissza ugyanazon tömb.

Pack szert és transzformátor új jar

Bit módosítani osztály Tester

Kezdje új szer AgentTester c
különböző változatai java eredmények eltérhetnek

Ha fut minden vállalati alkalmazás egy szerrel, akkor kap néhány érdekes eredmény, mint például az egyik projekt kezdete után kaptam a következő:

Mérjük meg a méret a Java objektumok


Tekintsünk egy másik példa a szerek használata. Írj egy osztályt, amely visszatér a méret a Java objektumok és javaagent játszanak kulcsfontosságú szerepet. Ki más, mint a JVM tudja a tényleges mérete a létrehozott objektumot. Instrumentation a felületen eljárás figyelemre méltó hosszú getObjectSize (Object objectToSize), amely visszatér a méret a tárgy. De a mi alkalmazás hozzáférjen az ügynök? És semmit se csinálni, és nem kell, javaagent automatikusan hozzáadódik a osztályútvonal és mi csak hozzá, hogy a szer típus mezőt hangszerelés műszereket és inicializálja azt premain módszer.


Mi kap hozzáférést AgentMemoryCounter.getSize módszer (obj) a kérelem osztályban.

Az eredmények alkalmazása a következők lehetnek

Felhívjuk figyelmét, hogy getObjectSize () metódus nem veszi figyelembe a méret a beágyazott objektumok, azaz számít csak memória fordítható egy objektum referenciát.

következtetés

> AgentCounter amely megjeleníti a nevét a betöltött osztály és számolja meg a betöltött osztályok
Van egy módja annak, hogy számolja meg a példányok ezen osztály

Mindig nagyon érdekelt, hogyan lehet megtudni: „Ki teremtette annyi sort vagy int [], és segítenek megtalálni a szülők ezeket a blokkokat?”
Talán már eldőlt a segítségével a meglévő szer vagy debugger?

Ehhez vannak profilerek. Például YourKit Java Profiler. A szabad, mint például az Eclipse Memory Analyzer eszköz.

A jelzett idő az időzóna, amely fel van szerelve a készülék.

Kapcsolódó cikkek