[ 
https://issues.apache.org/jira/browse/TRAFODION-2218?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Suresh Subbiah resolved TRAFODION-2218.
---------------------------------------
    Resolution: Fixed

> Memory leak from JVM used for TMUDF compile time interaction
> ------------------------------------------------------------
>
>                 Key: TRAFODION-2218
>                 URL: https://issues.apache.org/jira/browse/TRAFODION-2218
>             Project: Apache Trafodion
>          Issue Type: Bug
>          Components: sql-cmp
>    Affects Versions: 2.0-incubating
>            Reporter: Suresh Subbiah
>            Assignee: Suresh Subbiah
>             Fix For: 2.1-incubating
>
>
> JVM heap size for the JNI JVM attached to master executor grows when the 
> executor is used to prepare queries with a TMUDF that have compile time 
> interaction methods defined.
> This can seen with the sessionize_java TMUDF that is part of the regression 
> framework. Please run regress/udr/TEST001 (after commenting out the clean_up 
> command at the end of the test). Then from a new sqlci session do
> set schema sch;
> prepare s from
> select * from udf(sessionize_java(table(select * from t001_Datatypes),
>                                   'C_VARCHAR', 'C_DECIMAL_UNSIGNED', 60));
> -- repeat prepare once more
> -------------- DO heap analysis as shown below
> -- repeat prepare 10 more times
> ------------- DO heap analysis as shown below
> >>>>>>>
> Heap analysis
> -- After 2 prepares
> jmap -histo:live <sqlci-pid> > histo0
> -- After 12 prepares
> jmap -histo:live <sqlci-pid> > histo1
> Second column below is num_occurences and third column is size in bytes
> [ssubbiah@edev08 hive]$ grep ReturnInfo histo* 
> histo0: 221:            12            384  
> org.trafodion.sql.udr.LmUDRObjMethodInvoke$ReturnInfo
> histo1:  94:            72           2304  
> org.trafodion.sql.udr.LmUDRObjMethodInvoke$ReturnInfo
> [ssubbiah@edev08 hive]$ grep "\[B" histo* | grep -v "\[\["
> histo0:   7:         14660        1595584  [B
> histo1:   6:         14714        2302296  [B
> This shows that the nested static class
> .LmUDRObjMethodInvoke$ReturnInfo is leaking. The leak rate is 6 instances per 
> statement compile. This class has byte arrays as data members which are used 
> to return invocation and plan infos. The leak in byte arrays contained is 
> taking more space.
> A leak rate of 14 ReturnInfo instances per compile was seen a different 
> instance. In that case compiling the statement 4000 times would have lead to 
> the 256 MB JVM heap being exhausted. This can result in errors for other 
> users of the JVM such as metadata queries or repository statements.
>  public static class ReturnInfo
>     {
>         // return status:
>         // <0: Internal error, check for Java exception
>         // 0:  Success
>         // >0: User-generated error, returnedSQLState_ and
>         //     returnedErrorMessage_ have details
>         int returnStatus_;
>         String returnedSQLState_;
>         String returnedMessage_;
>         byte [] returnedInvocationInfo_;
>         byte [] returnedPlanInfo_;
> ...
> }
> The fix is remove static keyword here. I could not think of a good reason on 
> why this class needed to be static.I went with the assumption that if 
> possible it is better for a nested class to be non-static as GC cleanup of 
> non-static classes is easier to visualize (same as other non-static classes). 
> Also added a deleteLocalRef where the ReturnInfo is instantiated on the C++ 
> JNI side. It was delete localRef that caused the leak to go away. It is not 
> clear if the change to non-static is necessary. I am going with the 
> assumption that non-static is better here.
> Heap analysis commands used before now show no live instances of ReturnInfo. 
> Byte array size also does not grow with increasing number of compiles.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to