注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > Java 内容正文:Java SE 6在Solaris的可观察性特征分析

Java SE 6在Solaris的可观察性特征分析

发布时间:2006-06-13 15:52:01 来源:天极开发 网友评论 0 条
  Java平台标准版(Java SE)6,代码名为"Mustang",是最新的Java SE发行版本(正在开发中)。Java SE 6源码和二进制代码都可以在www.Java.net上下载。Java SE 6平台要到2006年秋天才能正式发布。不过,现在你可以下载试用Java SE 6 Beta版。

  Java SE 6平台中提供了多种可观察性(observability)工具,这其中的许多工具都可在系统中运行,而这些工具中的只有极少数被用于挂起进程或核心复制处理。因此,在本文中,我们将分析这些可观察性工具在进程上的效果。

  一、 在Java SE 6平台中的可观察性工具-DTrace

  在Java SE 6软件中又引入了许多可观察性改进功能。尽管其中大多数可适用于所有的平台,但是其中的一些改进仅是特定于Solaris操作系统(特别针对Solaris 10及更高版本)的。在J2SE 5.0平台中,引入了一种新的动态跟踪(DTrace)行为——Jstack。正如我们已经了解的,Jstack能够打印混合模式堆栈跟踪信息(Java和本机C/C++语言是以帧方式显示的)。当从一个给定的Java进程中发出pollsys系统调用时,下列D脚本将输出对混合模式堆栈的跟踪信息:

#!/usr/sbin/dtrace -s
syscall::pollsys:entry
/ pid == $1 / {
/*打印至多50帧*/
jstack(50);
}

  下面是上面脚本的运行结果:

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
[...篇幅所限,删去了一些输出结果...]

  其实,Jstack就是Java可观察性在Solaris 10 OS及以上版本中的一个很有用的起点。但是,Java SE 6中远不止这些,它新增加了许多针对Java虚拟机(JVM)可观察性和Java应用程序可观察性的Dtrace probe。Java SE 6发行中增加两种JVM特定的DTrace提供者-hotspot和hotspot_jni。

  二、 hotspot提供者

  hotspot提供者增加了许多探针,它们可以大致地作如下分类:

  · VM生命周期探针-VM启动,关闭事件

  · 线程生命周期探针-线程启动,停止,等等

  · 类加载探针-一个Java类加载或卸载

  · 垃圾收集探针-GC启动,结束

  · 方法编译探针-Java字节码-到-本机代码编译("hotspot编译")

  · 监视器探针-Java监视竞争性入口,通知,通知全部,等等

  · 应用程序探针-Java对象分配,Java方法入口/返回,等等

  有关于这些探针的更为详细的信息,请参考Keith McGuigan的博客。下面是使用这些探针的一些示例。

  (一) 打印Java线程的名称

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等价物

  你可能已经使用过-verbose:class JVM选项。当一个Java类加载或卸载时,这个选项能够使JVM打印一个跟踪消息。下面是使用Dtrace得到相同结果的情况:

/*当每个类加载时,打印出其各自的名称*/
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()方法打印一个包含Java帧的堆栈跟踪。这个D脚本将打印Java代码,Java本机接口(JNI)代码,C/C++代码以及OS C/C++代码的所有的帧-无论何时引发一个例外。

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代码中的所有的异常和错误都直接或间接地派生自java.lang.Throwable,因此所有的异常构造器最后都将调用java.lang.Throwable的构造器。这个D脚本建立一个方法入口探针-使用一个针对该构造器的过滤器(注意,<init>是构造器方法的内部名)。当调用这个构造器时,jstack()行为将打印混合模式堆栈跟踪。

  (四) Java堆直方图

  我们可以使用object-alloc探针来构建一个Java堆直方图,如下所示:

hotspot$1:::object-alloc {
 self->str_ptr = (char*) copyin(arg1, arg2+1);
 self->str_ptr[arg2] = '/0';
 self->classname = (string) self->str_ptr;
 @allocs_count[self->classname] = count();
 @allocs_size[self->classname] = sum(arg3);
}

  (五) hotspot_jni提供者

  JNI允许Java程序与C/C++代码进行交互。如果你想观察Java代码与本机代码的交互,你可以使用hotspot_jni提供者。对于每一个JNI函数输入/输出而言,这个提供者将暴露一个探针。

  (六) 在Java程序中使用Dtrace的效果

  Dtrace被设计为一种生产模式可观察性系统(未使用时具有零影响)。当支持探针时,被观察的系统不受影响。

  由于大部分的由hotspot和hotspot_jni提供者所暴露的JVM探针都是轻量级的,因此可以用于生产机器中。然而,一些由hotspot提供者所暴露的探针要求使用一个特定的命令行选项"-XX:+ExtendedDTraceProbes"来启动JVM。这些探针分别是:Java方法入口/方法返回,对象分配和Java监视器探针。注意,这些探针都要求改变hotspot字节码解释器和hotspot编译器(字节码-到-机器代码编译器)。即使不被支持时,这些探针的代价也是比较昂贵的。

相关文章
  • Java SE 6中的AWT模态增强功能
  • 实例分析Java SE 6.0新增功能
  • JSR 291通过复审投—Java SE动态组件支持
  • 快速建站工具Java SOS 4.75发布
  • 用Java Swing作一个日历控制程序
【评论】【收藏本文】【打印】【关闭】
上一篇文章:Java SE 6中的AWT模态增强功能
下一篇文章:EJB 3.0是Hibernate的克隆吗?
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
Java控件设计入门
Java控件设计入门
推荐阅讯
  • 浅析Java多线程编程中的高级技术
  • CORBA对象生命周期之早期和后期绑定
  • Javac--Java编程语言编译器
  • IT业界名词解释:J2EE
  • Java系统中内存泄漏测试方法的研究
  • Eclipse插件开发之添加简单的GUI元素
  • 通过实例论证J2ME的事件传输机制
  • Java服务器端编程安全必读
  • Java咖啡馆(9)——一个压缩归档实用软件
  • 全面理解Java中的String数据类型
阅读排行
  • 1.Java连接SQL Server 2000
  • 2.Java文件操作详解
  • 3.Java控件设计入门
  • 4.Java操作Excel电子表格
  • 5.Java: JNI完全手册
  • 6.Java命令行简介
  • 7.开发J2EE应用应遵循的几点原则
  • 8.Servlet与Javabean配置
  • 9.Java规则引擎与其API应用详解
  • 10.CLASSPATH详解
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载