一、in-process(推薦的),在進程內部讀取JMX數據,使用-javaagent的premain(),在main方法執行以前register JMX和一些默認的Explorer,並啓動一個HttpServer將從JMX收集過來的metrics轉換成Http協議,供Prometheus週期性的Pull抓取。java
二、獨立進程,經過JMX的RMI接口讀取數據並轉化成Http協議,優勢:有升級不用重啓被採集對象的進程,缺點:多維護一個進程且不能監控進程的metrics(如:內存、CPU,即in-process的默認Explorer)。bootstrap
javaagent在java.long.instrument包中,可在java程序運行時動態修改系統中Class的類型。其中的premain方法是在java虛擬機啓動時在main()方法執行以前被調起,能夠攔截用戶類,可是有些系統類先於agent啓動會攔不到。框架
java -cp ** HelloApp時的裝載順序,當執行java命令時SystemClassLoader會先進行裝載->連接->初始化而後再調用main(),由此推測premain應該是在main()的裝載類以前被調用的。spa
JVM有兩種加載器:啓動類加載器和用戶自定義加載器,啓動類加載器加載方向是從bootstramp->user-defined,用戶自定義:user-defined->bootstrap(雙親委派).net
pemain只能在類加載以前修改字節碼(類AOP的攔截),加載完成以後只能經過從新建立ClassLoader的方式從新加載。
agentmain能夠不用添加啓動參數,能夠在運行後(加載完成)修改,而且不須要從新建立加載器,很強大到用法限制比較多。htm
Ref:對象