Hola de nuevo. Después de mucho estrés
encontré la solución a este problema de la liberación de memoria. No es la más elegante (Creo yo), pero si fue efectiva, por si alguna vez necesitan hacer algo similar, aquí está la respuesta.
Código:
<%@ page language="java"
contentType="application/vnd.ms-excel; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%
Date date=new Date();
SimpleDateFormat dFormat=new SimpleDateFormat("dd-MMM-yyyy");
response.addHeader("Content-Disposition",
"attachment;filename=\"GBS Biller Inbound Errors "+dFormat.format(date)+".xls\"");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@page import="java.util.Date"%>
<%@page import="java.text.DateFormat"%>
<%@page import="java.text.SimpleDateFormat"%>
<html>
<head>
<title>Open Errors</title>
</head>
<body>
<div id="document" style="position: relative; left: 30px">
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td id="mainCell">
<h6 id="pageTitle" style="font-size: 12pt; color: #3B73B9;">Open
Errors</h6>
<br>
<div></div>
</td>
</tr>
</table>
</td>
<td colspan="9"> </td>
</tr>
<tr>
<td>
<table cellpadding="0" cellspacing="0" border="0">
<c:forEach items="${selFilters}" var="filter" varStatus="index">
<c:set var="fil" value="${filters[index.count-1]}"/>
<tr style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #3B73B9; font-weight: bold">
<td align="left">${fil}</td>
<c:catch var="cException">
<c:set var="isNum" value="${filter/1}" />
</c:catch>
<c:choose>
<c:when test="${filter!=null && filter!='select'}">
<c:choose>
<c:when test="${cException==null}">
<td align="left" style="mso-number-format:\@">${filter}</td>
</c:when>
<c:otherwise>
<td align="left">${filter}</td>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<td align="left">
N/A
</td>
</c:otherwise>
</c:choose>
</tr>
</c:forEach>
</table>
</td>
</tr>
<tr rowspan="2">
<td> </td>
</tr>
</table>
<br>
<br>
<table style="position: relative; left: 30px" width="100%" border="1">
<thead>
<tr>
<th colspan="56" style="color: #3B73B9;" align="left">Transaction Errors</th>
</tr>
<tr style="font-family: Arial, Helvetica, sans-serif; font-size: 10px; color: #FFFFFF; background-color: #3B73B9">
<th>Nb</th>
<th>TRANS_SEQ_ID</th>
<th>HDR_TRLR_SEQ_ID</th>
<th>SENDING_GL</th>
<th>OP_GL</th>
<th>CREATE_DATE</th>
<th>CREATE_TIME</th>
<th>REC_TYPE</th>
<th>REC_NUMBER</th>
<th>ME</th>
<th>GOLD_ID</th>
<th>COUNTRY_ISO_CODE</th>
<th>PL_NUMBER</th>
<th>BRIN_BALANCING_SEGMENT</th>
<th>BRIN_COST_CENTER</th>
<th>BRIN_REFERENCE_ID</th>
<th>PROJECT</th><th>ACCOUNT</th>
<th>STAT_LOCAL_CURRENCY</th>
<th>STAT_LOCAL_AMT</th>
</tr>
</thead>
<tbody>
<c:forEach items="${tList}" var="trans" varStatus="index">
<c:set var="pat" value="${patterns[index.count-1]}" scope="request"/>
<tr style="font-family: Arial, Helvetica, sans-serif; font-size: 10px;">
<td>${index.count}</td>
<td><c:out value="${trans.transSeqId}">${trans.transSeqId}</c:out></td>
<td><c:out value="${trans.hdrTrlr}">${trans.hdrTrlr}</c:out></td>
<td><c:out value="${trans.sendingGl}">${trans.sendingGl}</c:out></td>
<td><c:out value="${trans.opGl}">${trans.opGl}</c:out></td>
<td><c:out value="${trans.createDate}">${trans.createDate}</c:out></td>
<td><fmt:formatDate value="${trans.createTime}" type="time" pattern="HH:mm:ss" /></td>
<td><c:out value="${trans.recType}">${trans.recType}</c:out></td>
<td style="mso-number-format:\@"><c:out value="${trans.recNumber}">${trans.recNumber}</c:out></td>
<td><c:out value="${trans.me}">${trans.me}</c:out></td>
<td><c:out value="${trans.goldId}">${trans.goldId}</c:out></td>
<td><c:out value="${trans.countryIsoCode}">${trans.countryIsoCode}</c:out></td>
<td style="mso-number-format:\@"><c:out value="${trans.plNumber}">${trans.plNumber}</c:out></td>
<td><c:out value="${trans.brinBalancingSegment}">${trans.brinBalancingSegment}</c:out></td>
<td><c:out value="${trans.brinCostCenter}">${trans.brinCostCenter}</c:out></td>
<td style="mso-number-format:\@"><c:out value="${trans.brinReferenceId}">${trans.brinReferenceId}</c:out></td>
<td style="mso-number-format:\@"><c:out value="${trans.project}">${trans.project}</c:out></td>
<td style="mso-number-format:\@"><c:out value="${trans.account}">${trans.account}</c:out></td>
<td><c:out value="${trans.statLocalCurrency}">${trans.statLocalCurrency}</c:out></td>
<td style="mso-number-format:${pat};">${trans.statLocalAmt}</td>
</tr>
</c:forEach>
<c:set var="tList" value="${null}" scope="request"/>
<c:set var="patterns" value="${null}" scope="request"/>
<c:set var="date" value="${null}" scope="request"/>
<c:set var="selFilters" value="${null}" scope="request"/>
<c:set var="filters" value="${null}" scope="request"/>
<c:remove var="tList" scope="request" />
<c:remove var="patterns" scope="request" />
<c:remove var="date" scope="request" />
<c:remove var="selFilters" scope="request" />
<c:remove var="filters" scope="request" />
</tbody>
</table>
</body>
</html>
Lo que hice fue simplemente hacer null los objetos y las listas que estaba utilizando para crear mi JSP (Con c:set) y luego remuevo los objetos con el tag <c:remove> (Código en negrita), esos mismos objetos son los que se pasan desde el controlador (Ver mensaje original); por alguna razón el ModelAndView al momento de desplegar el JSP no estaba soltando la memoria de los objetos que utiliza, supongo que esto pasa porque los objetos son inalcanzables, pero al no ser nulos el Garbage Collector los deja vivir más, con lo que la memoria no es liberada con la rapidez que se necesitaba. Al momento de settear null los objetos, el
GC está listo para tomarlos.
Si tienen una mejor solución, compartanla!
. Saludos.