Uploaded image for project: 'Velocity'
  1. Velocity
  2. VELOCITY-841

Velocity 2.0 memory usage improvement (even 50+% smaller template memory usage)

    Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.0
    • Fix Version/s: 2.0
    • Component/s: Engine
    • Labels:
      None

      Description

      Here's a somewhat radical patch that does two fundamental changes:

      1. Token objects returned by the Parser that are normally carried around by AST Nodes are dropped completely or for the most part for many node types. This should be ok since Token is an internal structure. Tokens are typically dropped after node init so line/column numbering and other features should still work.

      2. Interpolated image class variable carried around by the ASTStringLiteral is no longer kept around.

      I ran some tests for large text intensive templates and according to Eclipse Memory Analyzer patched 2.0.0 version template memory consumption was 50-60% smaller than with Velocity 1.7. Analyzer also shows that there are some duplicate strings (e.g. #if) that could be avoided by adding some logic but I didn't do it yet.

      I also removed string interning from the code since there have been some reports with big memory consumption after running Velocity for a while.

      There's a test build if you want to try this out:
      http://www.sci.fi/~jviinama/velocity/memoryboost/velocity-engine-core-2.0.0-SNAPSHOT.jar

      Note that Velocity 2.0 handles macro parameters differently than 1.7 so 2.0 may not work as drop in replacement for your app which is designed to work with 1.7.

      It would be interesting to hear comments about this change and if the test build works for you. All Velocity tests pass but real life use will most probably reveal bugs or design goofs that I overlooked.

      PS. These changes are not limited to Velocity 2.0 so same logic could be applied to 1.7 to reduce memory consumption.

      1. VELOCITY-841.patch
        56 kB
        Jarkko Viinamäki

        Activity

        Hide
        claude Claude Brisson added a comment -

        Applied (commit 1753788).
        I preferred to make String interning a configuration option, with the default set to true (better choice for memory, I suppose).

        Show
        claude Claude Brisson added a comment - Applied (commit 1753788). I preferred to make String interning a configuration option, with the default set to true (better choice for memory, I suppose).

          People

          • Assignee:
            claude Claude Brisson
            Reporter:
            wyla Jarkko Viinamäki
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development