使用 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。
|