国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用JVM工具接口創(chuàng)建調(diào)試和分析代理

2019-11-18 11:02:07
字體:
供稿:網(wǎng)友

  java 虛擬機(jī)工具接口(Java Virtual Machine Tool Interface,JVMTI)提供了一種編程接口,答應(yīng)軟件開發(fā)人員創(chuàng)建軟件代理以監(jiān)視和控制 Java 編程語言應(yīng)用程序。JVMTI 是 Java 2 Software Development Kit (SDK), Standard Edition, 版本 1.5.0 中的一種新增功能。它取代了 Java Virtual Machine PRofiling Interface (JVMPI),從版本 1.1 起即作為 Java 2 SDK 的一種實(shí)驗(yàn)功能包括在內(nèi)。在 JSR-163 中對 JVMTI 進(jìn)行了有關(guān)說明。

  本文闡述如何使用 JVMTI 創(chuàng)建 Java 應(yīng)用程序的調(diào)試和分析工具。這種工具(也稱作代理)在應(yīng)用程序中發(fā)生事件時(shí),能夠使用該接口提供的功能對事件通知進(jìn)行注冊,并查詢和控制該應(yīng)用程序。這里提供了 JVMTI 的文檔資料。JVMTI 代理對于調(diào)試和調(diào)優(yōu)應(yīng)用程序十分有用。它可以對應(yīng)用程序的各個(gè)方面予以說明,如內(nèi)存分配情況、CPU 利用情況及鎖爭奪情況。

  盡管 JVMPI 現(xiàn)在仍處于實(shí)驗(yàn)階段,很多 Java 技術(shù)開發(fā)人員已經(jīng)在使用它了,而且已經(jīng)把它應(yīng)用到多種市場上提供的 Java 應(yīng)用程序 Profiler。請注重,極力鼓勵(lì)開發(fā)人員使用 JVMTI 而不使用 JVMPI。JVMPI 在不久的將來將被廢止。

  JVMTI 在多個(gè)方面改進(jìn)了 JVMPI 的功能和性能。例如:

  1) JVMTI 依靠于每個(gè)事件的回調(diào)。這比 JVMPI 設(shè)計(jì)使用需要編組和取消編組的事件結(jié)構(gòu)更有效。

  2) JVMTI 包含四倍于 JVMPI 的函數(shù)(包括用于獲取關(guān)于變量、字段、方法和類的信息的更多函數(shù))。有關(guān) JVMTI 函數(shù)的完整索引,請參見函數(shù)索引頁。

  3) JVMTI 比 JVMPI 提供更多類型的事件通知,包括異常事件、字段訪問和修改事件、斷點(diǎn)和單步驟事件等。

  有些從未被充分利用的 JVMPI 事件,如 Arena 的 new 和 delete,或者通過字節(jié)碼工具很輕易就能獲得的內(nèi)容,或者 JVMTI 函數(shù)本身(如 heap dump 和 object allocation)往往被 丟掉。 對這些事件的描述位于事件索引頁。

  JVMTI 是基于功能的,而 JVMPI 對于相應(yīng)性能影響卻是“要么全有,要么全無”。

  JVMPI 堆功能不可伸縮。

  JVMPI 沒有錯(cuò)誤返回信息。

  JVMPI 在 VM 實(shí)現(xiàn)方面具有很強(qiáng)的侵入性,輕易導(dǎo)致維護(hù)問題和性能受損。

  JVMPI 是個(gè)實(shí)驗(yàn)產(chǎn)品,不久將廢止。

  在本文的以下部分,我們介紹一個(gè)簡單代理,它使用 JVMTI 函數(shù)從 Java 應(yīng)用程序提取信息。 代理的編寫必須使用本地代碼。這里給出的示例代理是使用 C 語言編寫的。您可以于此下載完整的示例代理代碼。下面幾段介紹如何初始化一個(gè)代理,以及代理如何使用 JVMTI 函數(shù)提取關(guān)于 Java 應(yīng)用程序的信息,以及如何編譯和運(yùn)行代理。此示例代碼和編譯步驟特定于 UNIX 環(huán)境,但是經(jīng)過修改后也可用于 Windows。這里介紹的代理可用于在任何 Java 應(yīng)用程序中分析線程和確定 JVM 內(nèi)存使用情況。

  這里包含一個(gè)用 Java 語言編寫的簡單程序,稱作 SimpleThread.java,并可從這里下載。我們使用 ThreadSample.java 演示此代理的預(yù)期輸出。

  JVMTI 的功能很多,在此無法詳述;但本文中的代碼可以提供一個(gè)出發(fā)點(diǎn),讓您去開發(fā)符合自己特定需求的分析工具。

  代理初始化

  本節(jié)介紹用于初始化代理的代碼。首先,代理必須包括 jvmti.h 文件,語句為 #include <jvmti.h>。

  另外,代理必須包含一個(gè)名為 Agent_OnLoad 的函數(shù),加載庫時(shí)要調(diào)用這一函數(shù)。Agent_OnLoad 函數(shù)用于在初始化 Java virtual machine (JVM) 之前設(shè)置所需的功能。Agent_OnLoad 簽名如下所示:

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
...

/* We return JNI_OK to signify sUCcess */
return JNI_OK;
}
  在我們的示例代碼中,我們必須為將要使用的 JVMTI 函數(shù)和事件啟用多種功能。一般情況下均需(在某些情況下必須)將這些功能添加到 Agent_OnLoad 函數(shù)中。有關(guān)每種函數(shù)或事件所需的功能的說明,參見 Java 虛擬機(jī)工具接口頁。例如,要使用 InterruptThread 函數(shù),can_signal_thread 功能必須為 true。我們把示例所需的全部功能都設(shè)置為 true,然后使用 AddCapabilities 函數(shù)將它們添加到 JVMTI 環(huán)境中:

static jvmtiEnv *jvmti = NULL;
static jvmtiCapabilities capa;
jvmtiError error;

...

(void)memset(&capa, 0, sizeof(jvmtiCapabilities));
capa.can_signal_thread = 1;
capa.can_get_owned_monitor_info = 1;
capa.can_generate_method_entry_events = 1;
capa.can_generate_exception_events = 1;
capa.can_generate_vm_object_alloc_events = 1;
capa.can_tag_objects = 1;

error = (*jvmti)->AddCapabilities(jvmti, &capa);
check_jvmti_error(jvmti, error, "Unable to get necessary JVMTI capabilities.");
...
  此外,Agent_OnLoad 函數(shù)通常用于注冊事件通知。在此示例中,我們在使用 SetEventNotificationMode 函數(shù)的 Agent_OnLoad 中啟用了多個(gè)事件,如 VM Initialization Event、VM Death Event 和 VM Object Allocation, 如下所示:



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 通州区| 黄陵县| 阳新县| 荆州市| 红河县| 图木舒克市| 墨竹工卡县| 镇平县| 正蓝旗| 永修县| 汕尾市| 讷河市| 弋阳县| 马公市| 天津市| 江北区| 汝阳县| 宁化县| 贡山| 清镇市| 郓城县| 漳浦县| 西安市| SHOW| 鄂州市| 毕节市| 离岛区| 民丰县| 互助| 长海县| 浙江省| 安吉县| 营口市| 木里| 林周县| 遂平县| 黄山市| 米易县| 城步| 邯郸县| 木兰县|