Java技术,IBM风格: 类共享 - 编程入门网
同一个 JVM 中的 RAMClass 之间共享。
在不进行共享的情况下,当 JVM 装载一个类时,它单独创建 ROMClass 和 RAMClass 并将它们存储在自己的本地进程内存中。在进行共享的情况下,如果 JVM 在类缓存中发现了 ROMClass,那么它只需要在自己的本地内存中创建 RAMClass;RAMClass 引用共享的 ROMClass。 因为大部分类数据存储在 ROMClass 中,因此可以节省虚拟内存。(“虚拟内 存占用” 一节将详细讨论这个问题。)已经填充的缓存还会显著改进 JVM 启动 时间,因为每个缓存的类的一部分定义工作已经完成了,而且会从内存装载类而 不是从文件系统装载。填充新缓存导致的启动时间开销(在本文后面 讨论)并不 显著,因为每个类只需在定义时重新定位到缓存中。 如果文件系统中的类发生变化,那么会怎么样? 因为缓存是无限期持久存在的,文件系统更新可能会使缓存中的类失效。因此 ,当类装载器请求一个共享的类时,缓存代码要负责确保返回的类总是与从文件 系统装载的类完全一样。当装载类时这一检查会透明地进行,所以用户可以在共 享类缓存的生命周期内修改和更新任意类,系统总会装载正确的类。 JVM 探测文件系统更新的方法是,将时间戳值存储在缓存中并在装载每个类时 比较缓存的值和实际值。如果它探测到一个 JAR 文件已经更新了,那么它不知道 哪些类已经更新了,所以缓存中所有从这个 JAR 装载的类都立即被标为过时的, 不能再从缓存中装载它们。当从文件系统装载这个 JAR 中的类并重新添加到缓存 中时,只添加实际修改过的类;那些没有修改的类实际上没有过时。 无法从缓存中清除类,但是 JVM 会尽可能高效地利用空间。例如,同样的类 不会添加两次,即使它是从许多不同的位置装载的。所以,如果三个不同的 JVM 分别从 /A.jar、/B.jar 和 /C.jar 装载同样的类 C3,类数据仍然只添加一次, 但是有三段元数据描述装载这个类的三个位置。 共享类实用程序 有许多实用程序可以用来管理活动缓存,它们都是 -Xshareclasses 的子选项 。(输入 java -Xshareclasses:help 就可以看到 -Xshareclasses 的所有有效 子选项。) 注意,实用程序(除了 expire 之外)实际上不启动 JVM,它们执行所需的操 作,然后退出,并不运行类。还要注意,每个实用程序都导致 Java 启动程序输 出消息 Could not create the Java virtual machine,因为没有启动 JVM。这 不是错误。 为了演示这些选项的使用方法,我们来看一些示例。首先,用不同的缓存名称 运行 HelloWorld 类,从而创建两个缓存,见清单 1: 清单 1. 创建两个缓存
运行 listAllCaches 子选项列出系统上的所有缓存并指出是否正在使用它们 ,见清单 2: 清单 2. 列出所有缓存
Java技术,IBM风格: 类共享(3)时间:2011-05-20 IBM Ben Corrie运行 printStats 选项输出指定缓存的统计信息,见清单 3。这里显示的字段 的意义请参考用户指南(参见 参考资料 中的链接)。 清单 3. 缓存的统计信息
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |