This should be a trigger to investigate whether the JVM heap space is set too low or that the ADF application over-consumes memory. Very frequently the latter is the case.
Developing a plan to manage and monitor this fetched data during the whole lifetime of an application is an absolute must. It is indispensable to your performance success. The first step is to measure the current number of rows fetched by the ADF application and determine the appropriate maximum fetch sizes for your data collections. You can measure real-time and historically how many rows the ViewObjects load into Java memory with the ADFBC Memory Analyzer. Limit all Viewobjects that frequently fetch more than 500 rows on a regular basis with a maximum fetchsize. Or use extra bind variables, add extra ViewCriteria to limit the number of rows. See also this blog for more details on this subject: limiting the JVM memory consumption.
This property is not known that well (I never see it set at customers). And if known underestimated I think – it is very important to at least set this property. Set this to for instance 1000 or preferably 500 rows. Then you will be surer your server will not run in an OutOfMemoryError and become unavailable.
You can still – if really needed – override this property on a ViewObject instance at the tuning section.
After setting this global fetch size our daily server unavailable problems did not occur anymore – we prevented any server from becoming unavailable. First, we set this to 20.000. That is still a lot, but this already prevented servers from becoming unavailable. Later we gradually set it down to 10.000, 5000 and 1000. It would have been better if this would have been done at the start of the project.
Later we analyzed the problem further and found the root cause in the ADF callstacks of the ADF Performance Monitor; on a particular ViewObject instance there were missing bind variables and ViewCriteria at runtime, after an ApplicationModule activation.
Conclusion: it is an absolute must to set this global row fetch limit to prevent servers from becoming unavailable. In addition to that, it keeps sessions small, prevents memory over-consumption and improves the performance a lot.