[stringtemplate-interest] what is the use for embeddedInstances ?

Jax Law jax at ning.com
Tue Jun 3 11:37:46 PDT 2008


Hi Terence,

Thanks for the prompt reply ! I've attached a simple test case where the 
memory leak can be reproduced.

Here is a summary of the issue:

1. A StringTemplateGroup is held from a singleton
2. One of the template ( the order_by, say ST1 ) has an anonymous 
template ( say ST2 )
3. The cached copy of the "order_by" template in the StringTemplateGroup 
has a chunk ( ASTExpr )
    that has a parse tree that leads to ST2
4. A copy of the ST1 obtained from the group.getInstanceOf() method 
return a new ST but the chunk
    list is copied as-is.
5. Calling toString() on the copy leads to a series of unwrapping of 
references of the AST and ultimately
    ST2.write() is called, which then addEmbeddedInstance is called.
6. Since ST2 is reachable from the singleton via the templates HashMap, 
embeddedInstances list is never
    garbage collected.

We have workaround the issue by simply making addEmbeddedInstnace() a 
no-op. It seems to have
also improved performance greatly. Another suggestion to avoid this 
issue is to make toString() and
write() method non-state-changing, or making dup() returns a true deep copy.

Thanks a lot !

Jax


Terence Parr wrote:
> thanks! just added bug:
>
> http://www.antlr.org:8888/browse/ST-39
>
> Ter
> On Jun 2, 2008, at 2:48 PM, Jax Law wrote:
>
>> Hi,
>>
>> In StringTemplate.java, what is the purpose of the LinkedList
>> embeddedInstances ?
>> I've searched the source tree and there is no usage of this LinkedList.
>> We've found
>> an obscure memory leak issue with embeddedInstances where the list 
>> has grown
>> to 10 million entries. The issue is that when
>> StringTemplate.getInstanceOf() method
>> is called, the copy it returns is not a true deep copy. It has many
>> references to the
>> original StringTemplate via the chunks Expr, StringTemplateAST ...etc.
>> One of
>> these references is accessible to a write() method call stack and thus
>> build up the
>> embeddedInstances LinkedList.
>>
>> Since no usage can be found, I am assuming we can make 
>> addEmbeddedInstance
>> a No-Op in our own build ?
>>
>> Thanks !
>>
>> Jax
>>
>> _______________________________________________
>> stringtemplate-interest mailing list
>> stringtemplate-interest at antlr.org
>> http://www.antlr.org:8080/mailman/listinfo/stringtemplate-interest
>
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: st39.jar
Type: application/octet-stream
Size: 4445 bytes
Desc: not available
Url : http://www.antlr.org:8080/pipermail/stringtemplate-interest/attachments/20080603/df4b2188/attachment.obj 


More information about the stringtemplate-interest mailing list