title: Java Memory issue using Apache.POI to read write Excel
body: <p>I am trying to read excel file...make some changes...save to new file.</p>
  
  <p>I have created small form with button...On pressing button..</p>
  
  <ul>
  <li>It will load Excel file and load all data to Array list of class I have created.</li>
  <li>It will loop through Array list and change few properties in objects.</li>
  <li>It will save data to new Excel file.</li>
  <li>Finally, it will clear Array list and show message box of completion.</li>
  </ul>
  
  <p>Now the problem is memory issue.
  <br>When form is loaded, I can see in windows task manager...javaw is using around 23MB.
  <br>During read and write excel...memory shoots upto 170MB.
  <br>After array list is cleared....Memory is not clearing up and stays around 150MB.</p>
  
  <p>Following code is attached to Event to button click.<br></p>
  
  <pre><code>MouseListener mouseListener = new MouseAdapter() {
          public void mouseReleased(MouseEvent mouseEvent) {
              if (SwingUtilities.isLeftMouseButton(mouseEvent)) {
                  ArrayList&lt;Address&gt; addresses = ExcelFunctions.getExcelData(fn);
                  for (Address address : addresses){
                      address.setZestimate(Integer.toString(rnd.nextInt(45000)));
                      address.setRedfinestimate(Integer.toString(rnd.nextInt(45000)));
                  }
                  ExcelFunctions.saveToExcel(ofn,addresses);
                  addresses.clear();
                  JOptionPane.showMessageDialog(null, "Done");
              }
          }
      };
  </code></pre>
  
  <p><br></p>
  
  <p>The code for Reading/Excel file in this Class.</p>
  
  <pre><code>public class ExcelFunctions {
  public static ArrayList&lt;Address&gt; getExcelData(String fn)
  {
      ArrayList&lt;Address&gt; output = new ArrayList&lt;Address&gt;();
      try
      {
          FileInputStream file = new FileInputStream(new File(fn));
  
          //Create Workbook instance holding reference to .xlsx file
          XSSFWorkbook workbook = new XSSFWorkbook(file);
  
          //Get first/desired sheet from the workbook
          XSSFSheet sheet = workbook.getSheetAt(0);
          System.out.println(sheet.getSheetName());
          //Iterate through each rows one by one
          Iterator&lt;Row&gt; rowIterator = sheet.iterator();
          while (rowIterator.hasNext())
          {
              Row row = rowIterator.next();
              int r = row.getRowNum();
              int fc= row.getFirstCellNum();
              int lc = row.getLastCellNum();
              String msg = "Row:"+ r +"FColumn:"+ fc + "LColumn"+lc;
              System.out.println(msg);
              if (row.getRowNum() &gt; 0) {
                  Address add = new Address();
                  Cell c0 = row.getCell(0);
                  Cell c1 = row.getCell(1);
                  Cell c2 = row.getCell(2);
                  Cell c3 = row.getCell(3);
                  Cell c4 = row.getCell(4);
                  Cell c5 = row.getCell(5);
                  if (c0 != null){c0.setCellType(Cell.CELL_TYPE_STRING);add.setState(c0.toString());}
                  if (c1 != null){c1.setCellType(Cell.CELL_TYPE_STRING);add.setCity(c1.toString());}
                  if (c2 != null){c2.setCellType(Cell.CELL_TYPE_STRING);add.setZipcode(c2.toString());}
                  if (c3 != null){c3.setCellType(Cell.CELL_TYPE_STRING);add.setAddress(c3.getStringCellValue());}
                  if (c4 != null){c4.setCellType(Cell.CELL_TYPE_STRING);add.setZestimate(c4.getStringCellValue());}
                  if (c5 != null){c5.setCellType(Cell.CELL_TYPE_STRING);add.setRedfinestimate(c5.getStringCellValue());}
                  output.add(add);
                  c0=null;c1=null;c2=null;c3=null;c4=null;c5=null;
              }
          }
          workbook.close();
          file.close();
      }
      catch (Exception e)
      {
          System.out.println(e.getMessage());
      }
      return output;
  }
  
  public static void saveToExcel(String ofn, ArrayList&lt;Address&gt; addresses) {
      XSSFWorkbook workbook = new XSSFWorkbook();
      XSSFSheet sheet = workbook.createSheet("Addresses");
  
      Row header = sheet.createRow(0);
      header.createCell(0).setCellValue("State");
      header.createCell(1).setCellValue("City");
      header.createCell(2).setCellValue("Zip");
      header.createCell(3).setCellValue("Address");
      header.createCell(4).setCellValue("Zestimates");
      header.createCell(5).setCellValue("Redfin Estimate");
  
      int row = 1;
  
      for (Address address : addresses){
          Row dataRow = sheet.createRow(row);
          dataRow.createCell(0).setCellValue(address.getState());
          dataRow.createCell(1).setCellValue(address.getCity());
          dataRow.createCell(2).setCellValue(address.getZipcode());
          dataRow.createCell(3).setCellValue(address.getAddress());
          dataRow.createCell(4).setCellValue(address.getZestimate());
          dataRow.createCell(5).setCellValue(address.getRedfinestimate());
          row++;
      }
  
  
      try {
          FileOutputStream out =  new FileOutputStream(new File(ofn));
          workbook.write(out);
          out.close();
          workbook.close();
          System.out.println("Excel with foumula cells written successfully");
  
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }
  }}
  </code></pre>
  
  <p><br>
  I am unable to figure out where the issue is.
  I m closing workbook/inputstream/outputstream and clearing Arraylist too. </p>