首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Eclipse OpenJ9 中的类共享(6)

Eclipse OpenJ9 中的类共享(6)

使用 Helper APIOpenJ9 提供了共享类 Helper API,使开发人员能够将类共享支持集成到自定义类加载器中。只有未扩展                                        java.net.URLClassLoader 的类加载器才需要 Helper                                API,因为这些类加载器会自动继承类共享支持。
对 Helper API 的全面介绍超出了本文的讨论范围,但我们仍会大体介绍一下。如果想了解更多细节,可以在   上找到 Helper API 实现。
Helper API:概述所有 Helper API 类都包含在                                  包中。每个希望共享类的类加载器都必须从 SharedClassHelperFactory 获取一个                                        SharedClassHelper 对象。创建                                        SharedClassHelper                                        之后,它就属于请求它的类加载器,只能存储这个类加载器定义的类。SharedClassHelper                                为该类加载器提供了一个简单 API,用于在共享缓存中查找和存储类。如果对这个类加载器进行垃圾收集,也会对它的                                        SharedClassHelper 进行垃圾收集。
使用 SharedClassHelperFactorySharedClassHelperFactory 是一个单例对象,可以使用静态方法                                        com.ibm.oti.shared.Shared.getSharedClassHelperFactory()                                获取它;如果在 JVM 中启用了类共享,那么该方法会返回一个工厂,否则它会返回 null。
使用 SharedClassHelper该工厂可以返回 3 种不同类型的 SharedClassHelper。每种帮助器可供一种不同类型的类加载器使用:
  • SharedClassURLClasspathHelper:这个帮助器可供那些拥有 URL                                        类路径概念的类加载器使用。使用 URL 类路径数组在共享缓存中存储和查找类。必须能够在文件系统上访问类路径中的 URL                                        资源,才能缓存这些类。这个帮助器还对如何在生命周期内修改类路径有一些限制。
  • SharedClassURLHelper:这个帮助器可供那些从任何 URL                                        加载类的类加载器用。必须能够在文件系统上访问所提供的 URL 资源,才能缓存这些类。
  • SharedClassTokenHelper:这个帮助器实际上会将共享类缓存转换为一个简单的哈希表 –                                        类按照对共享缓存无意义的字符串密钥令牌来存储。这是唯一没有提供动态更新功能的帮助器,因为存储的类没有关联的文件系统上下文。
每个 SharedClassHelper 都有两个基本方法,对于不同的帮助器类型,这两个方法的参数稍有不同:
  • 在类加载器向其父加载器请求类(如果该类存在)之后,应该调用 byte[]                                                findSharedClass(String classname...)。如果                                                findSharedClass() 未返回                                        null,那么类加载器应该在返回的字节数组上调用                                                defineClass()。注意,此函数为                                                defineClass() 返回的一个特殊                                        cookie,而不是实际的类字节,所以不能修改这些字节。
  • 在定义一个类后,应该立即调用 boolean storeSharedClass(Class                                                clazz...)。如果成功地存储了这个类,那么该方法将返回 true,否则返回                                                false。
返回列表