计算 JVM 服务器的存储需求

要在 CICS 区域中成功运行 JVM 服务器,必须确保有足够的可用 z/OS 存储器可供 JVM 及其部署的应用程序使用。

关于此任务

JVM 服务器及其中的 Java 应用程序所需的存储空间并非来自 CICS 管理的存储区域,如 DSA、EDSA 或 GDSA。 有些存储区域由处理请求的 Language Environment 管理,如 C® 代码发出的 malloc() 。 其余存储区域由 JVM 直接管理,使用 z/OS 存储管理请求,如 IARV64。 这两种存储区域管理类型都使用来自可用专用区域的存储器。

请务必确保在 24 位, 31 位和 64 位寻址范围内提供足够的未分配用户区域存储器。 如果初始化时未满足以下任何最低存储需求,那么 JVM 服务器初始化将失败,并返回消息 DFHSJ0914E :
  • 至少 512K 未分配的 24 位 z/OS® 存储空间
  • 至少有 256K 个连续区域在未分配的 24 位 z/OS 存储器中可用
  • 至少 32,768K 个未分配的 31 位 z/OS 存储器
  • 至少 1G 个未分配的 64 位 z/OS 存储器

此外,当用户区域存储器运行不足时, CICS 无法使用其 "存储空间不足" 机制。

用于分配 z/OS 存储区的主要 Java 组件如下所示:
  • Java 堆
  • 装入 Java 类
  • JIT 编译高速缓存
  • 本机堆栈
  • Java 监视器
  • Java 线程
  • UNIX 共享库

Java 堆是 64 位存储器的连续预分配块,用于存储所有对象和数组的运行时数据区。 它由 JVM 垃圾回收进程管理,只有在 JVM 重新启动时才能修改其大小。 其他 JVM 存储区域的大小更动态,它们的大小可能因使用情况而异。 除了JVM分配的存储区域外,您还必须考虑使用私有区域并与JVM交互的其他组件,例如 JDBC 类型2驱动程序、 IBM® MQ Java适配器或第三方工具。

要估算 JVM 在不同专用区域中使用的存储量,可以使用以下过程。

过程

  1. 计算 24 位存储器。

    每个 JVM 线程都需要 4 KB 的 24 位存储器。 单个 JVM 服务器可以启动超过 50 个后台守护程序线程; 此数目不包括由 JVMSERVER THREADLIMIT 属性定义的 CICS管理的 JVM 服务器线程数。 如果您正在使用 Liberty JVM 服务器,那么守护程序线程数可以为 100 或更大。

    UNIX 系统服务在创建新线程的过程中临时需要 256 KB 的连续 24 位存储器。 最低 24 位需求的计算方法如下:

    256KB + (4KB * number_of_threads)
  2. 计算 31 位存储器。

    多个 JVM 组件可以从 31 位专用区域分配存储器,包括装入 Java 类, CICS 控制块, Java 线程堆栈, JIT 编译器和 JVM 使用的 USS 动态链接库 (DLL) 文件。

    1. Java 类装入

      缺省情况下,具有 -Xmx (堆) 值 57GB 或更低的 CICS JVM 服务器使用 Java 压缩引用。 压缩引用指示 JVM 创建更小的对象,使用更小的对象可以提高性能。 使用压缩引用会导致 Java 对象,类,线程和监视器装入到 31 位存储器中的 LE HEAP31 存储区中。 如果 31 位存储器中的空间不足,那么类装入将失败,从而导致 JVM 终止。 设置 JVM 命令行选项 –Xnocompressedrefs 将禁止使用压缩引用,而是将 Java 类装入到 64 位存储器中。

    2. JIT 编译器

      JIT 编译器负责通过编译 Java 字节代码进行持续优化。 可执行代码存储在 JIT 代码高速缓存中,静态数据存储在 JIT 数据高速缓存中。 在 z/OS、Version 2 Release 3 和 Java 8 SR5 之前,代码缓存存储在 31 位存储中,而数据缓存存储在 64 位存储中。 根据 Java 应用程序的数量和 JIT 活动的数量,31 位 JIT 代码缓存可动态扩展到由 JVM 设置决定的最大大小。 -Xcodecachetotal. 缺省为 128 MB。 如果高速缓存已满,那么 JIT 进程将停止,但 JVM 将继续以降低的潜在性能运行。 如果您正在使用 z/OSV 2 Release 3,那么可以通过升级到 Java 8 SR5来释放 31 位专用区域中的更多空间,这支持针对 JIT 代码高速缓存的 64 位应用程序 (RMODE64) 的驻留方式。 这会将已编译的 JIT 代码存储在 64 位专用区域中。

      6.3CICS® TS 6.3 起,已删除对 Java 8 和 Java 11 的支持。

    3. UNIX 共享库

      共享库区域是 z/OS 功能部件,它使地址空间能够提高装入 UNIX 系统服务动态链接库 (DLL) 文件的性能,并共享关联的实存储器。 缺省情况下,共享库功能在 CICS JVM 服务器中处于禁用状态,但受 IBM Java SDK 支持。 在区域中启动使用共享库的第一个 JVM 进程时,共享库区域会保留 31 位高专用区域中的存储器。 有关更多信息,请参阅 调整 z/OS 共享库区域

      注:

      如果使用 Java 8 SR5 和单个应用程序,那么第一个在 CICS 区域中启动的 JVM 服务器可以根据配置和工作负载将 51M 分配到 31 位专用区域的 115M 。

      后续 JVM 服务器占用空间较小,可以在 8M 到 73M之间的任何位置进行分配,因为 JVM DLL 文件只需要装入一次。

      这些数字不包括 UNIX 共享库区域,如果已启用,那么还必须将其值添加到 31 位存储器中。

  3. 计算 64 位存储器。

    多个 JVM 组件可以从包含 Java 堆,本机线程堆栈, Java 类, JIT 编译器输出和 Java 监视器的 64 位专用区域分配存储器。 所需的 64 位存储量至少可以估算为 2 GB ,而更大的工作负载或更复杂的配置需要额外的存储量。

    要更准确地估算 64 位存储器,您需要考虑:
    • 使用 -Xmx设置的最大 Java 堆值。
    • JVM 中所有线程的最大数目。 每个线程至少需要 3 MB Language Environment 堆栈存储空间,其中包括 1 MB 堆栈。 这包括支持每个线程所需的至少 1 MB 本机堆栈存储空间、1 MB 备用存储空间和 1 MB Language Environment 控制块。 请参阅确定 Language Environment JVM 服务器的存储需求
    • Java 类、JIT 缓存和 Language Environment 64 位堆的存储空间。 根据工作负载和配置,您可以添加 300 MB 到 500 MB 的最佳猜测。
    注意: Java共享类缓存使用UNIX共享内存,不计入 CICS 区域的地址空间MEMLIMIT。

    需要将生成的数字向上舍入到下一个 GB ,以说明 CICS GDSA 扩展查看受保护存储器的方式。

  4. 运行样本统计信息程序 DFH0STAT 以获取用于估算 z/OS 存储器的存储器统计信息。

    查看 用户区域,扩展用户区域和 MEMLIMIT 存储器监视 报告,以获取有关 z/OS 用户区域存储器,扩展用户区域存储器和 MEMLIMIT 存储器中未分配存储器的状态的信息。 该报告还提供了有关在各个存储区域中出现存储空间不足 (SOS) 情况的信息。

    查看 高于 2 GB (64 位存储器) 的存储器 报告,以获取有关使用 64 位 z/OS 存储器的信息。

    • 记下 1 的值Current Unallocated Total,分别指示 z/OS 用户区域存储器 (24 位) ,扩展用户区域存储器 (31 位) 和 MEMLIMIT 存储器 (64 位) 中的当前未分配存储量。
    • 记下 2 的值MEMLIMIT minus Current Address Space active,指示当前可用于 CICS 区域的 64 位存储量。
    User region, extended user region and MEMLIMIT storage monitoring
    _________________________________________________________
                                                        User Region               Extended User Region                  MEMLIMIT
                                                       _________________________________________________________________________
      Last monitor sample time . . . . . . . . . . . :  03/11/20**  16:22:13      03/11/20**  16:22:13      03/11/20**  16:22:13
      State. . . . . . . . . . . . . . . . . . . . . :                Normal                    Normal  
      Current unallocated total. . . . . . . . . . . :                5,956K                  392,956K                     8162M   1 
      LWM unallocated total. . . . . . . . . . . . . :                5,956K                  392,956K                     8162M
      Current unallocated largest contiguous area. . :                5,956K                  392,168K                       N/A
      LWM unallocated largest contiguous area. . . . :                5,956K                  392,168K                       N/A
      Last date and time SOS . . . . . . . . . . . . :
      SOS duration...................................:         00:00:00.0000             00:00:00.0000             00:00:00.0000 
      Times SOS......................................:                     0                         0                         0      
      Current tasks waiting because SOS. . . . . . . :                     0                         0                       N/A 
      Peak tasks waiting because SOS . . . . . . . . :                     0                         0                       N/A
      Total waits because SOS. . . . . . . . . . . . :                     0                         0                       N/A
      Time tasks waited because SOS. . . . . . . . . :        00:00:00.00000            00:00:00.00000                       N/A  
    
    Storage ABOVE 2GB (64-bit storage)
    __________________________  
      MEMLIMIT Size. . . . . . . . . . . . :               15,360M 
      MEMLIMIT Set By. . . . . . . . . . . :                  JCL 
       
      Current Address Space active (bytes) :      1,164,967,936 
      Current Address Space active . . . . :             1,111M 
      Peak Address Space active. . . . . . :             1,375M  
      
      MEMLIMIT minus Current Address Space active. . . . . . . :          14,249M     2 
      Number of Private Memory Objects . . . . . . . . . . . . :               35 
        ....minus Current GDSA extents . . . . . . . . . . . . :               15 
      Bytes allocated to Private Memory Objects. . . . . . . . :           2,236M  =       2,344,615,936 
        ....minus Current GDSA allocated . . . . . . . . . . . :           1,212M  =       1,270,874,112
      Bytes hidden within Private Memory Objects . . . . . . . :           1,125M  =       1,179,648,000
        ....minus Current GDSA hidden. . . . . . . . . . . . . :           1,124M  =       1,178,599,424
          ....minus CICS Internal Trace Table hidden . . . . . :             130M 
      Bytes usable within Private Memory Objects . . . . . . . :           1,111M  =       1,164,967,936
      Peak bytes usable within Private Memory Objects  . . . . :           1,826M  =       1,914,699,776
      Current GDSA Allocated . . . . . . . . . . . . . . . . . :           1,024M  =       1,073,741,824
      Peak GDSA Allocated. . . . . . . . . . . . . . . . . . . :           1,024M 
    
  5. 启动 JVM 服务器并运行具有代表性的 Java 工作负载。
    观察每个用户区域的值如何更改,并确保它们不受约束。

    在 JVM 服务器初始化期间,将对可用的 24 位, 31 位或 64 位存储器执行检查。 如果初始化时可用的存储空间不足,那么初始化将失败并显示消息 DFHSJ0914E

下一步操作

根据您获得的估算值设置 Java 内存限制。 有关指示信息,请参阅 设置 Java 的内存限制