What it means
Language Environment (LE) manages two kinds of storage for a program. The stack holds local storage and save areas for each routine as it is called. The heap holds storage the program or the runtime asks for while it runs. LE ends the program with U4088 when managing either one fails.
There are two broad cases. In the first, LE couldn't get enough storage, often below the 16 MB line, where space is small. In the second, LE found the control information it keeps for a stack or heap segment damaged. That almost always means something wrote outside its own storage and overlaid LE's data.
The reason code that comes with the abend tells you which case you have. Look it up under abend 4088 in the Language Environment runtime messages manual for your z/OS release. The two cases need different fixes, so don't skip this step.
Common causes
- Not enough storage below the 16 MB line. Programs that run AMODE 24, or runtime options that place the stack or heap below the line, use up that small area quickly.
- The region is too small for the step, so LE can't extend the stack or heap.
- A storage overlay. The program wrote past the end of a table or buffer, or through a bad pointer, and damaged LE's control information next to it.
- In CICS, the region was short on storage, so LE couldn't get what the transaction needed.
- Occasionally a product defect. Searching IBM or the vendor's support site for the reason code and the module named in the dump usually shows whether a fix exists.
How to find the problem
- Note the reason code from IEF450I or the symptom dump, and look it up. It is the fastest way to tell a shortage from damage.
- Read the CEE messages in the step's output and the CEEDUMP if one was produced. With storage damage, expect the dump to be less reliable than usual.
- Rerun with the runtime option RPTSTG(ON). LE then writes a storage report showing how much stack and heap the program used, both above and below the line. A shortage shows up clearly.
- For suspected damage, rerun with HEAPCHK(ON). LE then checks the heap as storage is requested and freed, and reports damage much closer to the point where it happened.
- Compile with SSRANGE in test. An out-of-range subscript is then caught at the statement that causes it, before it corrupts any storage.
How to fix it
- For a shortage, raise the REGION on the job or step, often to REGION=0M if your site allows it.
- Move storage above the line. Run programs AMODE 31 where you can, and use ALL31(ON) with the ANYWHERE settings on the STACK and HEAP options.
- For damage, find and fix the overlay in the program, usually a table overrun or a pointer that was never set.
- In CICS, the CICS systems programmers need to look at the short-on-storage conditions and the storage limits of the region.
- If the reason code points to an internal error, search for it on IBM's support site and apply any fix it names.
- Shortages are usually fixed by whoever owns the JCL or the region. Overlays are an application fix.
What it looks like
IEA995I SYMPTOM DUMP OUTPUT USER COMPLETION CODE=4088 REASON CODE=000003EC IEF450I CLMEXT01 STEP040 - ABEND=S000 U4088 REASON=000003EC