ONCODE=451 存储条件被触发
ONCODE=451 The STORAGE condition was raised
我最近发布了 HOST 报告程序的更新。我们的商店使用 Enterprise PLI。
我添加了 2 个声明为 BASED 的新结构。所以我基本上使用 ALLOC 语句为结构分配所需的存储空间,然后将指针传递给 Fetchable 以获得我需要的一些细节。
它在生产中的试验 运行 期间因存储错误而失败(下面的 LEMSG)。它试图在那里处理超过一百万条记录,看来这项工作基本上 运行 存储空间不足。
IBM0451S ONCODE=451 The STORAGE condition was raised.
From entry point MXXX at compile unit offset +000001EA at entry offset
更多详情:IBM0451S
作为修复,我发布了一个更新以在 Fetchable 调用后明确为存储添加免费,并且我还将我的 JCL 的 REGION PARM 更新为 0M。
我想我会检查一下您以前是否遇到过此类错误并有任何其他想法。谢谢
这是我最新更新的代码的样子
DECLARES
=======================================
DCL
01 IN_DATA BASED(IN_PTR),
% INCLUDE SYSLIB(XXXXXPAA);
DCL
01 OUT_DATA BASED(OUT_PTR),
% INCLUDE SYSLIB(YYYYYPAA);
DCL
01 IN_PTR PTR;
DCL
01 OUT_PTR PTR;
======================================
The below block of code runs for every record that get processed. The
FREE statement is what i now added. I was thinking that because i did
not have a FREE before , the ALLOC was basically getting new STOARGE
everytime it executed that block of code and ran out of storage.
ALLOC IN_DATA;
ALLOC OUT_DATA;
IN_DATA = '';
OUT_DATA = '';
IN_DATA.CODE = 'XXX';
CALL FABCD(IN_PTR,
OUT_PTR);
IF OUT_DATA.RTRN_CD <= 04 THEN
DETAIL_REC.XYZ = OUT_DATA.YYY_CODE;
ELSE
;
FREE IN_DATA; -------->> What i added now
FREE OUT_DATA; -------->> What i added now
=============================================
这是预期的行为。根据您的描述,您的初始代码存在内存泄漏,分配存储而不释放它。现在您已经添加了代码以在不再需要时释放已分配的内存,您可能不需要 REGION=0M,尽管正如评论中所指出的那样,它可能并没有按照您的意愿进行。
除了存储问题之外,为每个记录进程分配和释放存储是一个巨大的性能杀手。
从您展示的片段来看,尚不清楚 a) 为什么首先要进行 ALLOC,以及 b) 为什么您认为每条记录都需要一个新的存储空间。
只需在本地分配结构,将指向它们的指针传递给函数。
DCL 01 IN_DATA,
% INCLUDE SYSLIB(XXXXXPAA);
DCL 01 OUT_DATA,
% INCLUDE SYSLIB(YYYYYPAA);
DCL IN_PTR PTR INIT ( ADDR( IN_DATA) );
DCL OUT_PTR PTR INIT ( ADDR( OUT_DATA ) );
这将 PL/I 仅分配一次结构,但仍允许将指向存储的指针传递给函数例程。
我还会删除第二个性能杀手:可能不需要的结构初始化
IN_DATA = ‘‘;
OUT_DATA = ‘‘;
这是一个字段一个字段的初始化。除非你有充分的理由,否则不要这样做。
我最近发布了 HOST 报告程序的更新。我们的商店使用 Enterprise PLI。
我添加了 2 个声明为 BASED 的新结构。所以我基本上使用 ALLOC 语句为结构分配所需的存储空间,然后将指针传递给 Fetchable 以获得我需要的一些细节。
它在生产中的试验 运行 期间因存储错误而失败(下面的 LEMSG)。它试图在那里处理超过一百万条记录,看来这项工作基本上 运行 存储空间不足。
IBM0451S ONCODE=451 The STORAGE condition was raised.
From entry point MXXX at compile unit offset +000001EA at entry offset
更多详情:IBM0451S
作为修复,我发布了一个更新以在 Fetchable 调用后明确为存储添加免费,并且我还将我的 JCL 的 REGION PARM 更新为 0M。
我想我会检查一下您以前是否遇到过此类错误并有任何其他想法。谢谢
这是我最新更新的代码的样子
DECLARES
=======================================
DCL
01 IN_DATA BASED(IN_PTR),
% INCLUDE SYSLIB(XXXXXPAA);
DCL
01 OUT_DATA BASED(OUT_PTR),
% INCLUDE SYSLIB(YYYYYPAA);
DCL
01 IN_PTR PTR;
DCL
01 OUT_PTR PTR;
======================================
The below block of code runs for every record that get processed. The
FREE statement is what i now added. I was thinking that because i did
not have a FREE before , the ALLOC was basically getting new STOARGE
everytime it executed that block of code and ran out of storage.
ALLOC IN_DATA;
ALLOC OUT_DATA;
IN_DATA = '';
OUT_DATA = '';
IN_DATA.CODE = 'XXX';
CALL FABCD(IN_PTR,
OUT_PTR);
IF OUT_DATA.RTRN_CD <= 04 THEN
DETAIL_REC.XYZ = OUT_DATA.YYY_CODE;
ELSE
;
FREE IN_DATA; -------->> What i added now
FREE OUT_DATA; -------->> What i added now
=============================================
这是预期的行为。根据您的描述,您的初始代码存在内存泄漏,分配存储而不释放它。现在您已经添加了代码以在不再需要时释放已分配的内存,您可能不需要 REGION=0M,尽管正如评论中所指出的那样,它可能并没有按照您的意愿进行。
除了存储问题之外,为每个记录进程分配和释放存储是一个巨大的性能杀手。
从您展示的片段来看,尚不清楚 a) 为什么首先要进行 ALLOC,以及 b) 为什么您认为每条记录都需要一个新的存储空间。
只需在本地分配结构,将指向它们的指针传递给函数。
DCL 01 IN_DATA,
% INCLUDE SYSLIB(XXXXXPAA);
DCL 01 OUT_DATA,
% INCLUDE SYSLIB(YYYYYPAA);
DCL IN_PTR PTR INIT ( ADDR( IN_DATA) );
DCL OUT_PTR PTR INIT ( ADDR( OUT_DATA ) );
这将 PL/I 仅分配一次结构,但仍允许将指向存储的指针传递给函数例程。
我还会删除第二个性能杀手:可能不需要的结构初始化
IN_DATA = ‘‘;
OUT_DATA = ‘‘;
这是一个字段一个字段的初始化。除非你有充分的理由,否则不要这样做。