配置受管资产和受管资产类装入器高速缓存大小
根据使用受管资产的流程应用程序数目和受管资产中的文件数目,在使用受管资产时可能会遇到性能降低的情况。 如果受管资产类装入器高速缓存和/或受管资产高速缓存太小,那么必须经常刷新相应的高速缓存,这会降低性能。 通过在 100Custom.xml 文件中设置配置参数来调整高速缓存,以定义受管资产的高速缓存大小。
关于本任务
设置以下配置参数以定义受管文件的高速缓存大小。 当活动的 Snapshot 和受管资产内容增加时,您可能需要增加高速缓存大小。 如果将高速缓存大小设置得太小,在使用受管资产过程中可能会发生系统颠簸,这是因为类装入器对象会频繁地换入和换出高速缓存。 当发生系统颠簸时,您可能会看到挂起线程,显示与
ManagedAssetClassLoader 代码相关的延迟。注: 避免将受管资产中的重复类用于快照,因为您无法控制哪些类装入。
<classloader-cache-size>- 流程应用程序或 Toolkit 的每个 Snapshot 都包含一个类装入器实例。 确保为
<classloader-cache-size>设置的值大于活动流程应用程序和 Toolkit Snapshot 的总数。 <classloader-resource-map-size><classloader-resource-map-size>参数指定托管资产可包含并在所有快照中缓存的 Java™ 类的数量。 大小必须足够大,以存储来自部署环境内 Snapshot 中所有受管资产 JAR 文件的所有文件。 当多个 Snapshot 包含一组相同的受管资产 JAR 文件时,您必须多次计算文件内容。 如果 Toolkit Snapshot 包含受管资产,您必须只计算文件内容一次,而不管流程应用程序或 Toolkit 引用它多少次。 在您设置的高速缓存大小中包含缓冲区,以便在进一步的应用程序开发时不会超出限制。 以下示例显示了如何计算所需的高速缓存大小。考虑一下在所有正在使用的 Snapshot 中具有以下受管资产 JAR 文件列表的情况:- file1.jar,包含 50 个类文件
- file2.jar,包含 70 个类文件
- file3.jar,包含 100 个类文件
<classloader-resource-map-size>设置为 (50 + 70 + 100) * 1.2 = 264。
以下 XML 片段显示了这些属性的缺省值。 您可以在 100Custom.xml 中使用该片段来配置高速缓存。
<server>
<classloader-cache-size merge="replace">1000</classloader-cache-size>
<classloader-resource-map-size merge="replace">5120</classloader-resource-map-size>
</server>
有关对 100Custom.xml进行更改的更多信息,请参阅 100Custom.xml 文件和配置。您可以使用以下方法来计算受管资产高速缓存和受管资产类装入器高速缓存的内存需求。 如果这些高速缓存的大小导致您的应用程序集群成员发生内存问题,那么您可能需要增加 Java 堆大小。
对于受管资产 JAR 文件中的每个文件,受管资产高速缓存使用的内存是两个列表之和。 一个列表包含资产,另一个列表则包含内部表示。 这两个列表的类型均为 java.util.LinkedList,并接受键值对。 键由 UUID 与在 JAR 文件中的路径组成。 UUID 始终为 36 字节,但路径长度及相应大小可能会有所不同。 两个列表均使用此键。
第一个列表将整个文件内容作为值进行保存。 您必须从 JAR 文件中抽取文件并检查文件大小。 第二个列表保存的内部表示始终为 52 字节。 文件的内存使用量可表示如下:
2 x (UUID + path length) + file content + internal representation通过替换固定值,可确定以下公式:2 x ( 36 bytes + path length) + file content + 52 bytes例如,考虑包含以下文件的 JAR 文件:* com/test/EchoService.class * com/test/EchoService.java, * META-INF/MANIFEST.MF * .classpath * .project虽然将会装入所有这些文件,但现在考虑的是 com/test/EchoService.class。 这两个列表的大小为:- 第一个列表
- 键 = (e9771549-3ff8-4d81-b678-f5dfee1b1b12, com/test/EchoService.class) = 36 字节
- 路径长度 = 26 字节
- 值 = com/test/EchoService.class 的文件内容 = 931 字节
- 第二个列表
- 键 = (e9771549-3ff8-4d81-b678-f5dfee1b1b12, com/test/EchoService.class) = 36 字节
- 路径长度 = 26 字节
- 值 = "managedasset:61.f9b29441-0b1a-4f03-adfd-e98120b3c435" = 52 字节
JAR 文件的大小和路径结构会影响内存使用量。 在打包 JAR 文件时,请记住以下注意事项:
- 在使用受管资产时,将装入整个 JAR 文件,包括其中包含的所有文件。 要减少装入的数据量,请从 JAR 文件中移除不必要的文件。 使用延迟方式装入受管资产。 在尝试访问 JAR 文件中的一个类时,将装入整个 JAR 文件。
- 内存使用量取决于文件大小和路径长度。 较深包结构中的数千个小文件可能会显著影响内存使用量。