Agent Java pe serviciul jvm

Agent Java pe serviciul jvm

Probabil mulți au auzit sau experimentat o astfel de parametru ca -javaagent JVM, vedeți această opțiune, puteți utiliza Jrebel Plumbr sau ar putea arăta astfel JAVA_OPTS = -javaagent: [cale / către /] jrebel.jar sau cam asa -javaagent: / calea-to /plumbr.jar






Deși javaagent a apărut în versiunea de java 1.5, mulți dezvoltatori nu au folosit niciodată capabilitățile agenților și au o idee vagă despre ceea ce este.
Ce fel de agent este asta? De ce ar avea nevoie de noi și cum să ne scrie?







După cum am scris mai sus, javaagent este unul dintre parametrii JVM care vă permite să specificați agentul care va fi lansat împreună cu aplicația dvs. sau, mai degrabă, va fi lansat chiar înainte de lansarea aplicației. Agentul în sine este o aplicație separată care oferă acces la mecanismul de manipulare a codurilor de octeți (java.lang.instrument) în timpul rulării. Acest lucru, dacă pe scurt. Documentația oficială poate fi citită aici. dar este destul de slab. Orice nu este clar? Deci, hai să ne ocupăm de asta. Cel mai bine este să înțelegeți exemplele.

Scrie un agent elementar

Rețineți că agentul trebuie să implementeze metoda premain cu următoarea semnătură
public static void premain (Arges string);
sau
public static void premain (Arginduri de coarde, Instrumentation inst);

Clasa agent trebuie să fie ambalată în borcan și să conțină MANIFEST.MF. cu atribut obligatoriu
Clasa PreMain - indică clasa agent cu metoda premain. Există și alte atribute ale agentului, dar ele sunt opționale și nu avem nevoie de ele acum.

Acesta este modul în care manifesta.mf va arăta.
nu uitați să adăugați o rupere de linie la sfârșitul fișierului

Acum împachetați-o în borcan

Și în sfârșit un tester de clasă

Rulați AgentTester din linia de comandă

Din acest exemplu vedem că:

  • metoda premain este executată înainte ca metoda principală a metodei principale să fie apelată.
  • agentul este specificat folosind parametrul -javaagent: jarpath [= options]

Să încercăm să extragem de la agent ceva beneficii


În general, mecanismul agenților este proiectat să manipuleze codul octet. dar voi modifica imediat octetul în acest articol, altfel nu vom merge dincolo de acest post. Cui este interesant este posibil să se uite la javassist ca mijloc standard de lucru cu codul de octet nu este prezent.

Să scriem AgentCounter care va tipări numele clasei încărcate și va număra numărul de clase încărcate. Deci, putem observa munca clasificatorului # a;


Notă, acum folosesc o altă semnătură a metodei premain. În obiectul de instrumentație, trec un ClassTransformer care face toată munca. ClassTransformer se va declanșa la fiecare încărcare a clasei. Dacă doriți să utilizați ClassTransformer, trebuie să implementați interfața java.lang.instrument.ClassFileTransformer și să adăugați obiectul prin Instrumentation.addTransformer


classfileBuffer - acesta este octet-codul clasei curente reprezentat ca o matrice octet, pentru redefinire lui de transformator ar trebui să se întoarcă o nouă gamă de octeți, în acest exemplu, nu se schimba conținutul clasei astfel încât returna doar aceeași matrice.

Împachetați un agent și un transformator într-un borcan nou

Modificați un tester de clasă mic

Lansați AgentTester cu un agent nou
pentru diferite versiuni de java rezultatele pot diferi

Dacă rulați o aplicație de întreprindere cu un astfel de agent, puteți obține rezultate destul de interesante, de exemplu, unul dintre proiectele de după lansare mi-a dat următoarele:

Măsurăm mărimea obiectelor java


Să luăm în considerare încă un exemplu de utilizare a agenților. Să scriem o clasă care să returneze dimensiunea obiectelor java și javaagent va juca un rol-cheie. Oricine, ca JVM, poate cunoaște dimensiunea reală a obiectului creat. în interfața Instrumentation există o minunată lungă metodă getObjectSize (Object objectToSize) care returnează dimensiunea obiectului. Dar cum să obțineți accesul la agent din aplicația noastră? Și nu trebuie să facem nimic special, javaagentul este adăugat automat la calea de clasă și trebuie doar să adăugăm câmpului de instrumentație Instrumentation agentului și să îl inițializăm în metoda premain.


Accesăm metoda AgentMemoryCounter.getSize (obj) din clasa de aplicații.

Rezultatele aplicației pot arăta astfel

Rețineți că metoda getObjectSize () nu ia în considerare dimensiunea obiectelor imbricate, adică doar memoria folosită pentru referința obiectului este luată în considerare.

concluzie

Două exemple simple de creare a unei stocări de fișiere într-un DBMS
Aproape fiecare proiect web necesită stocarea propriilor fișiere. Are multe misiuni. Astăzi ne uităm la două variante simple ale creației sale: primul - cu utilizarea Java mijloace de tip de date BLOB, Spring MVC, Hibernate, MySQL, iar al doilea - cu gruparea (compartimentarea fișierul în bucăți) înseamnă groovy, potire, hibernare,

Agent Java pe serviciul jvm

Agent Java pe serviciul jvm

Introducerea lui Kotlin și asamblarea borcanului cu maven
Acest post este o notă despre modul în care am ajuns să cunosc limba Kotlin, ce resurse, instrumente și pentru asta am folosit pentru al compila în borcan și a alerga în consola. În general, sunt programator PHP, un pic zak cu Java. A doua zi am decis să văd Kotlin. Aceasta este o limbă mai puțin limpede scrisă de la JetBrains până la punctul că este, de fapt, tastat static. În

Agent Java pe serviciul jvm

Conectarea fonturilor la proiectul dvs.
Bună ziua, toată lumea! Oricine a dezvoltat cel puțin o aplicație pentru Android, sa gândit cum să vă conectați la fontul personalizat al proiectului. Deci mi-am pus această întrebare. Există mai multe moduri. Apa este una dintre ele: String custom_font = "fonts / custom_font.ttf"; Tipul de caractere CF = Typeface.createFromAsset (getAssets (), custom_font);

Agent Java pe serviciul jvm

Definiți toate clasele pe care aplicația le utilizează în Java
Fără îndoială, oricine care în CV-ul său arată experiența de a lucra la Java, cel puțin o dată în viața sa a scris liniile publice static void principal # 91; # 93; args # 41; le-a compilat și le-a fugit pentru executare printr-o comandă ca java HelloWorld. Dar câte persoane știu ce se întâmplă în cadrul JVM din momentul în care această comandă a fost executată înainte de control







Trimiteți-le prietenilor: