Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/AreaTreeHandler.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/AreaTreeHandler.java	(revision 698947)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/AreaTreeHandler.java	(working copy)
@@ -124,7 +124,7 @@
      */
     protected void setupModel(FOUserAgent userAgent, String outputFormat,
             OutputStream stream) throws FOPException {
-        model = new RenderPagesModel(userAgent, outputFormat, fontInfo, stream);
+        model = new CachedRenderPagesModel(userAgent, outputFormat, fontInfo, stream);
     }
 
     /**
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/RenderPagesModel.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/RenderPagesModel.java	(revision 698947)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/area/RenderPagesModel.java	(working copy)
@@ -140,6 +140,13 @@
             processOffDocumentItems(pendingODI);
             pendingODI.clear();
         }
+        
+        /* DEBUG */
+        System.gc();System.gc();System.gc();System.gc();System.gc();System.gc();
+        long mem = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
+        System.out.println("[PAGINA " + page.getPageNumberString() + "] Memoria occupata:\t" + (mem / 1024) + " kB");
+        System.out.flush();
+        /* END DEBUG*/
     }
 
     /**
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java	(revision 698947)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java	(working copy)
@@ -377,6 +377,10 @@
         if (fobj != null) {
             getPSLM().notifyEndOfLayout(fobj.getId());
         }
+        // Free memory of the area tree
+        if (this instanceof BlockStackingLayoutManager) {
+        	((BlockStackingLayoutManager)this).parentArea = null;
+        }
     }
 
     /**
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java	(revision 698947)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java	(working copy)
@@ -382,6 +382,8 @@
             // Add the line areas to Area
             childLM.addAreas(childPosIter, lc);
         }
+        // Release childLM for freeing memory
+        proxyLMiter = new ProxyLMiter();
 
         addMarkersToPage(false, isFirst(firstPos), isLast(lastPos));
 
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java	(revision 698947)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java	(working copy)
@@ -1592,6 +1592,11 @@
             }
         }
         setCurrentArea(null); // ?? necessary
+        
+        // Release all ChildContext and LineLayouts
+        setChildContext(null);
+        lineLayouts = null;
+        lineLayoutsList = null;
     }
 
     /**
Index: /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
===================================================================
--- /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java	(revision 698947)
+++ /Users/dario/Documents/tesi/workspace3/FOP/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java	(working copy)
@@ -427,6 +427,9 @@
         flush();
 
         curBlockArea = null;
+        
+        // Needed for freeing the area tree
+        parentArea = null;
     }
 
     /** Adds background areas for the column, body and row, if any. */
