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

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

Java SE 6在Solaris的可觀(guān)察性特征分析

2019-11-18 11:35:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  java平臺(tái)標(biāo)準(zhǔn)版(Java SE)6,代碼名為"Mustang",是最新的Java SE發(fā)行版本(正在開(kāi)發(fā)中)。Java SE 6源碼和二進(jìn)制代碼都可以在www.Java.net上下載。Java SE 6平臺(tái)要到2006年秋天才能正式發(fā)布。不過(guò),現(xiàn)在你可以下載試用Java SE 6 Beta版。

  Java SE 6平臺(tái)中提供了多種可觀(guān)察性(observability)工具,這其中的許多工具都可在系統(tǒng)中運(yùn)行,而這些工具中的只有極少數(shù)被用于掛起進(jìn)程或核心復(fù)制處理。因此,在本文中,我們將分析這些可觀(guān)察性工具在進(jìn)程上的效果。

  一、 在Java SE 6平臺(tái)中的可觀(guān)察性工具-DTrace

  在Java SE 6軟件中又引入了許多可觀(guān)察性改進(jìn)功能。盡管其中大多數(shù)可適用于所有的平臺(tái),但是其中的一些改進(jìn)僅是特定于Solaris操作系統(tǒng)(非凡針對(duì)Solaris 10及更高版本)的。在J2SE 5.0平臺(tái)中,引入了一種新的動(dòng)態(tài)跟蹤(DTrace)行為——Jstack。正如我們已經(jīng)了解的,Jstack能夠打印混合模式堆棧跟蹤信息(Java和本機(jī)C/C++語(yǔ)言是以幀方式顯示的)。當(dāng)從一個(gè)給定的Java進(jìn)程中發(fā)出pollsys系統(tǒng)調(diào)用時(shí),下列D腳本將輸出對(duì)混合模式堆棧的跟蹤信息:

#!/usr/sbin/dtrace -s
syscall::pollsys:entry
/ pid == $1 / {
/*打印至多50幀*/
jstack(50);
}
  下面是上面腳本的運(yùn)行結(jié)果:

libc.so.1`__pollsys+0xa
libc.so.1`poll+0x52
libjvm.so`int os_sleep(long long,int)+0xb4
libjvm.so`int os::sleep(Thread*,long long,int)+0x1ce
libjvm.so`JVM_Sleep+0x1bc
java/lang/Thread.sleep
dtest.method3
dtest.method2
dtest.method1
dtest.main
[...篇幅所限,刪去了一些輸出結(jié)果...]
  其實(shí),Jstack就是Java可觀(guān)察性在Solaris 10 OS及以上版本中的一個(gè)很有用的起點(diǎn)。但是,Java SE 6中遠(yuǎn)不止這些,它新增加了許多針對(duì)Java虛擬機(jī)(JVM)可觀(guān)察性和Java應(yīng)用程序可觀(guān)察性的Dtrace PRobe。Java SE 6發(fā)行中增加兩種JVM特定的DTrace提供者-hotspot和hotspot_jni。

  二、 hotspot提供者

  hotspot提供者增加了許多探針,它們可以大致地作如下分類(lèi):

  · VM生命周期探針-VM啟動(dòng),關(guān)閉事件

  · 線(xiàn)程生命周期探針-線(xiàn)程啟動(dòng),停止,等等

  · 類(lèi)加載探針-一個(gè)Java類(lèi)加載或卸載

  · 垃圾收集探針-GC啟動(dòng),結(jié)束

  · 方法編譯探針-Java字節(jié)碼-到-本機(jī)代碼編譯("hotspot編譯")

  · 監(jiān)視器探針-Java監(jiān)視競(jìng)爭(zhēng)性入口,通知,通知全部,等等

  · 應(yīng)用程序探針-Java對(duì)象分配,Java方法入口/返回,等等

  有關(guān)于這些探針的更為具體的信息,請(qǐng)參考Keith McGuigan的博客。下面是使用這些探針的一些示例。

  (一) 打印Java線(xiàn)程的名稱(chēng)

hotspot$1:::thread-start {
self->ptr = (char*) copyin(arg0, arg1+1);
self->ptr[arg1] = '/0';
self->threadname = (string) self->ptr;
printf("Thread %s started/n", self->threadname);
}

  (二) 在D腳本中的-verbose:class等價(jià)物

  你可能已經(jīng)使用過(guò)-verbose:class JVM選項(xiàng)。當(dāng)一個(gè)Java類(lèi)加載或卸載時(shí),這個(gè)選項(xiàng)能夠使JVM打印一個(gè)跟蹤消息。下面是使用Dtrace得到相同結(jié)果的情況:

/*當(dāng)每個(gè)類(lèi)加載時(shí),打印出其各自的名稱(chēng)*/
hotspot$1:::class-loaded {
self->str_ptr = (char*) copyin(arg0, arg1+1);
self->str_ptr[arg1] = '/0';
self->name = (string) self->str_ptr;
printf("class %s loaded/n", self->name);
}
  (三) 打印異常中的棧跟蹤信息(除了混合模式)

  Throwable.printStackTrace()方法打印一個(gè)包含Java幀的堆棧跟蹤。這個(gè)D腳本將打印Java代碼,Java本機(jī)接口(JNI)代碼,C/C++代碼以及OS C/C++代碼的所有的幀-無(wú)論何時(shí)引發(fā)一個(gè)例外。

hotspot$1:::method-entry {
 self->ptr = (char*)copyin(arg1, arg2+1);
 self->ptr[arg2] = '/0';
 self->classname = (string)self->ptr;
 self->ptr = (char*)copyin(arg3, arg4+1);
 self->ptr[arg4] = '/0';
 self->methodname = (string)self->ptr;
}
hotspot$1:::method-entry
/ self->classname == "java/lang/Throwable" && self->methodname == "<init>" / {
 jstack();
}
  在Java代碼中的所有的異常和錯(cuò)誤都直接或間接地派生自java.lang.Throwable,因此所有的異常構(gòu)造器最后都將調(diào)用java.lang.Throwable的構(gòu)造器。這個(gè)D腳本建立一個(gè)方法入口探針-使用一個(gè)針對(duì)該構(gòu)造器的過(guò)濾器(注重,<init>是構(gòu)造器方法的內(nèi)部名)。當(dāng)調(diào)用這個(gè)構(gòu)造器時(shí),jstack()行為將打印混合模式堆棧跟蹤。

  (四) Java堆直方圖

  我們可以使用object-alloc探針來(lái)構(gòu)建一個(gè)Java堆直方圖,如下所示:



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蓬莱市| 大姚县| 进贤县| 栾川县| 青阳县| 迭部县| 河北区| 奎屯市| 龙口市| 江华| 宁都县| 屏东市| 蒲城县| 瑞安市| 曲阜市| 襄樊市| 湖州市| 麦盖提县| 苏尼特左旗| 弥渡县| 沙田区| 扎鲁特旗| 永城市| 凤山县| 高要市| 彭阳县| 汽车| 祁连县| 桃园市| 滦平县| 斗六市| 曲松县| 平邑县| 长丰县| 大厂| 桐城市| 茌平县| 浮梁县| 孟州市| 乐业县| 乐至县|