Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-13556

Memory leak in FlashScope - expired elements are not cleared

    Details

    • Type: Bug
    • Status: Resolved (View Workflow)
    • Priority: Major
    • Resolution: Done
    • Affects Version/s: None
    • Fix Version/s: 20.0.0.Final
    • Component/s: JSF
    • Labels:
      None
    • Steps to Reproduce:
      Hide

      1. Deploy the attached reproducer.
      2. Press "Accumulate 100MB in FlashScope" button several times, then, OOMError will occur.

      Show
      1. Deploy the attached reproducer. 2. Press "Accumulate 100MB in FlashScope" button several times, then, OOMError will occur.
    • Workaround Description:
      Hide
      • Using SessionScope instead of FlashScope for POST-REDIRECT-GET.
      • Set com.sun.faces.numberOfConcerrentFlashUsers and com.sun.faces.numberOfFlashesBetweenFlashReapings to web.xml as following
        <context-param>
            <param-name>com.sun.faces.numberOfConcerrentFlashUsers</param-name>
            <param-value>10</param-value>
        </context-param>
        <context-param>
            <param-name>com.sun.faces.numberOfFlashesBetweenFlashReapings</param-name>
            <param-value>1</param-value>
        </context-param>
        
      Show
      Using SessionScope instead of FlashScope for POST-REDIRECT-GET. Set com.sun.faces.numberOfConcerrentFlashUsers and com.sun.faces.numberOfFlashesBetweenFlashReapings to web.xml as following <context-param> <param-name> com.sun.faces.numberOfConcerrentFlashUsers </param-name> <param-value> 10 </param-value> </context-param> <context-param> <param-name> com.sun.faces.numberOfFlashesBetweenFlashReapings </param-name> <param-value> 1 </param-value> </context-param>

      Description

      Objects in FlashScope is not cleared and keep accumulating even if POST-REDIRECT-BACK is completed.

      If we put a huge object to FlashScope continuously as the following code, Java heap space will be exhausted soon.

      @Model
      public class Action {
      
          private static final int oneHundredMB = 1024 * 1024 * 100;
      
          public String next() {
              Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
              flash.putNow("huge", new byte[oneHundredMB]);
              return "index.xhtml?faces-redirect=true";
          }
      }
      

      When OutOfMemoryError is happened, flashInnerMap field in com.sun.faces.context.flash.ELFlash is bloated.

      Class Name                                                             | Ref. Objects | Shallow Heap | Ref. Shallow Heap | Retained Heap
      -----------------------------------------------------------------------------------------------------------------------------------------
      java.lang.Thread @ 0xeea24380  default task-1 Thread                   |            1 |          120 |                64 |        20,800
      '- <Java Local> com.sun.faces.context.flash.ELFlash @ 0xee9e4608       |            1 |           40 |                64 |            64
         '- flashInnerMap java.util.concurrent.ConcurrentHashMap @ 0xee9e4630|            1 |           64 |                64 |   314,574,048
      -----------------------------------------------------------------------------------------------------------------------------------------
      

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  spyrkob Bartosz Spyrko-Smietanko
                  Reporter:
                  fjuma Farah Juma
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  1 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: