Rád bych si ujasnil rozdíl mezi nativním agentem JVM TI a Java Agentem.
Jestli jsem to správně pochopit tak nativní agent sleduje především JVM a to na nejnižší úrovni, zato Java Agent primárně běžící aplikací.
Java Agent stojí na instrumentaci kódu (java.lang.instrument) a ideálně (komfortně) se programuje s pomocí AOP, kdy instrumentujete cílovou aplikaci (target application). Je psán typicky v Javě. Zato nativní agent registruje callbacky pro události JVM.
Na něco jsem zapomněl?
Jak moc se agenti ve svých schopnostech překrývají? Můžete pomocí JVM TI například přidat kód před a za volání metody? To by se pak překrývali značně.
Shodou okolností o java agentech, AspectJ a Load Time Weavingu, změně kódu za běhu programu, jsem se nedávno rozepsal na svém blogu a uvolnil jsem nějaké zdrojové kódy:
http://mostly-about-java.blogspot.co.uk/2012/12/methodcallspy-building-own-method_3.html
MethodCallSpy – building own method tracing Java Agent with AspectJ
http://mostly-about-java.blogspot.co.uk/2012/12/methodcallspy-building-advanced-socket.html
MethodCallSpy – building advanced socket listening tracing tool
Zdravim. JVM TI a Java Agenti se v urcitych ohledech prekryvaji, ale napriklad pro AOP jsou agenti (+nejaka vhodna knihovna nad nimi) mnohem jednodussi.
V JVM TI je take mozne modifikovat bajtkod (ja tam callback funkce, ktera zachyti pristup), ale je to na tak nizke urovni, ze se pohybujete vlastne na urovni "strojaku" virtualniho stroje, coz me osobne treba nevadi :-) ale psat v tom neco slozitejsiho nez proste pridani ja nevim logovani bych se asi neodvazil.
hmm jeste jsem zapomel doplnit (mozna jsem to hodil to uvodniho dilu o JVM TI) ze krome nizkourovnoveho JVM TI je mozne pouzit JDWP (Java Debug Wire Protocol), ktere je pro nektere funkce mnohem jednodussi - typicky pro jednoduche debuggery, ktere pouze potrebuji nasetovat breakpointy, vyjet si stack trace atd. I tam je mozne si hrat s instrumentaci...