12
返回列表 发新帖
楼主: Sky-Tiger

使用泛型和并发改善集合

[复制链接]
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
11#
 楼主| 发表于 2013-5-10 20:38 | 只看该作者
MemoryMXBean 在 MXBean 之间是惟一的,因为它能够把内存使用情况以事件的方式向客户机对象动态地发送通知。对于内存使用超过一些预设阈值的问题,即时通信的好处显而易见,因为可能是应用程序级上的问题征兆,或者表明需要对虚拟机进行进一步的调整。
MemoryMXBean 使用的通知模型来自 JMX MBean 规范,该规范与 Java 编程中使用的事件通知模型很相似。作为通知的广播者,MemoryMXBean 实现了 JMX 接口 javax.management.NotificationBroadcaster,这个相对小的接口允许 bean 注册有兴趣的合作方或取消注册。然后,每个有兴趣的合作方(对象)都必须实现 javax.management.NotificationListener 接口。这个接口只包含一个操作,在事件发生的时候,由发出 MXBean 的事件调用。
侦听器可以在虚拟机生命周期的任何时候注册(或取消注册)到 MemoryMXBean 上。通知只广播到当前 已注册的合作方。
侦听器的处理器方法在被调用时,会接收到 javax.management.Notification 类的实例。这是 JMX 事件通知模型中的通用事件信号类型。它被设置成容纳造成它生成的事件的相当数量的信息。对于 MemoryMXBean,目前有两类通知:
虚拟机中的内存资源(有时叫做内存池)增长超过了预先设置的阈值。这种事件由 MemoryNotificationInfo 常量 MEMORY_THRESHOLD_EXCEEDED 表示。

垃圾收集之后 内存资源的大小超过了预先设置的阈值。这由 MemoryNotificationInfo 常量 MEMORY_COLLECTION_THRESHOLD_EXCEEDED 表示。
在处理器方法中接收到 Notification 对象后,注册的侦听器可以查询 Notification 的类型,根据 MemoryNotificationInfo 的两个值检查生成的字符串,从而判断出发生的事件类型。
要向侦听器传递事件的详细信息,MemoryMXBean 会用代表 MemoryNotificationInfo 对象 javax.management.openmbean.CompositeData 的具体实例正确地设置发出的 Notification 对象的用户数据(实际上,就是广播者包含任何想要的信息的方法)。就像在 通过平台服务器监视远程虚拟机 中解释的一样,在 JMX 开放数据类型中封装事件数据,可以让最广泛的侦听器都能理解数据。

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
12#
 楼主| 发表于 2013-5-10 20:39 | 只看该作者
安全性
到目前为止都还不错。现在是面对被甩在一边的重要问题 —— 安全性 —— 的时候了。不如果不想让谁的应用程序代码访问和修改虚拟机,该怎么办?有什么选项可用么? 可以设置一些系统属性,来控制访问级别和虚拟机数据从 JMX 代理向管理客户机传递虚拟机数据的方式。这些属性分成两类:口令认证 和安全套接字层(SSL)。
使用命令行选项
为了让 5.0 兼容的虚拟机可以被监视和管理,需要用以下命令行选项设置平台 JMX 代理的端口号:
-Dcom.sun.management.jmxremote.port=<number>

如果不介意谁通过这个端口访问虚拟机,也可以添加以下两个选项,关闭口令认证和 SSL 加密(这两项默认都是开启的):
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

在开发 java.lang.management 客户机代码,而且想方便地监视另一台虚拟机时,一起使用这三个选项会很方便。在生产环境中,则需要设置口令控制或 SSL(或者两者都要设置)。
口令认证
在 5.0 SDK 的 jre/lib/management 目录中,可以找到一个叫做 jmxremote.password.template 的文件。这个文件定义了两个角色的用户名和口令。第一个是监视 角色,允许访问只读的管理函数;第二个是控制 角色,允许访问读写函数。取决于需要的访问级别,客户可以用 monitorRole 或 controlRole 用户名进行认证。为了确保只有认证的用户才能访问,需要做以下工作:
把 jmxremote.password.template 的内容拷贝到叫做 jmxremote.password 的文件中,并取消掉文件末尾定义用户名和口令部分的注释,根据需要修改口令。

修改 jmxremote.password 的许可,只让所有者能够读取和修改它。(在 UNIX 和 UNIX 类的系统上,把许可设置成 600。在 Microsoft Windows 上,请按照 “How to secure a password file on Microsoft Windows systems” 一文中的说明操作,可以在 参考资料 中找到这篇文章的链接。)

在启动虚拟机时,用以下命令行选项指定要使用的口令文件的位置:

-Dcom.sun.management.jmxremote.password.file=<file-path>     

从管理客户的角度来说,需要提供正确的用户名/口令组合来访问开启了认证的虚拟机。如果客户是 JConsole,这很简单:在初始的 Connection 选项卡中提供了用户名和口令字段。要编写向远程虚拟机提供认证细节的代码,需要把清单 16 所示的修改添加到清单 4 中提供的连接代码:

清单 16. 连接到要求用户认证的远程虚拟机

try {
    // provide a valid username and password (e.g., via program arguments)
    String user = "monitorRole";
    String pw = "password";
   
    // place the username and password in a string array of credentials that
    // can be used when making the connection to the remote JMX agent
    String[] credentials = new String[] { user, pw };
    // the string array of credentials is placed in a map keyed against the
    // well-defined credentials identifier string   
    Map<String, String[]> props = new HashMap<String, String[]>();
    props.put("jmx.remote.credentials", credentials);
    // supply the map of credentials to the connect call
    JMXServiceURL address =
      new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi");
    JMXConnector connector = JMXConnectorFactory.connect(address, props);
   
    // it is a trivial matter to get a reference for the MBean server
    // connection to the remote agent
    MBeanServerConnection mbs = connector.getMBeanServerConnection();
} catch ...  

对要求认证的虚拟机提供错误的用户名或口令会造成 java.lang.SecurityException。类似地,以 monitorRole 进行认证,然后想调用读写操作 —— 例如试图请求垃圾收集 —— 也会造成抛出 SecurityException。

使用道具 举报

回复
论坛徽章:
2
茶鸡蛋
日期:2012-06-01 15:14:09奥运会纪念徽章:射箭
日期:2012-09-12 17:02:34
13#
发表于 2013-5-11 09:52 | 只看该作者
好资料...MARK一下有时间再来学习!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表