[ https://issues.apache.org/jira/browse/JOHNZON-293?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16987031#comment-16987031 ]
Romain Manni-Bucau commented on JOHNZON-293: -------------------------------------------- Hi, AFAIK we already do that for JSON-B - not mapper (historical reason only), did you compare both? Also note that the title is misleading since it does not leak, it just consumes as much memory as simultaneous requests AFAIK. > Potential Memleak in DateConverter > ---------------------------------- > > Key: JOHNZON-293 > URL: https://issues.apache.org/jira/browse/JOHNZON-293 > Project: Johnzon > Issue Type: Bug > Components: Mapper > Reporter: Alexander Falb > Priority: Major > > [DateConverter|https://github.com/apache/johnzon/blob/master/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DateConverter.java] > creates a new SimpleDateFormat for every instance for every thread the > instance is used on and never cleans them up. This may cause a high memory > usage, if lots of those converters are created instead of reused. > > Two approaches to get rid of them are on my mind: > # Create a new SimpleDateFormat within the toString and fromString methods > as method variable instead of a class field. > # Use java.time.DateTimeFormatter as class field, because it is immutable > and thread-safe, and do some object conversion from java.util.Date to/from > java.time.ZonedDateTime. > > I did some JMH performance tests for both (full project can be found here > [https://github.com/elexx/dateconverter-benchmark]): > {noformat} > Benchmark Mode Cnt Score > Error Units > JavaTimeDateFormatterBenchmark.formatNewFormat avgt 5 828,623 ± > 8,836 ns/op > JavaTimeDateFormatterBenchmark.formatReuseFormat avgt 5 496,916 ± > 5,150 ns/op > JavaTimeDateFormatterBenchmark.parseNewFormat avgt 5 1430,276 ± > 11,084 ns/op > JavaTimeDateFormatterBenchmark.parseReuseFormat avgt 5 990,648 ± > 280,983 ns/op > SimpleDateFormatterBenchmark.formatNewFormat avgt 5 1308,144 ± > 13,993 ns/op > SimpleDateFormatterBenchmark.formatReuseFormat avgt 5 392,236 ± > 3,219 ns/op > SimpleDateFormatterBenchmark.parseNewFormat avgt 5 1848,772 ± > 19,412 ns/op > SimpleDateFormatterBenchmark.parseReuseFormat avgt 5 1121,955 ± > 12,417 ns/op > {noformat} > In this quick test it looks like creating a new SimpleDateFormatter in each > method is quite slow (1308ns/op + 1848ns/op). > Reusing the SimpleDateFormatter is faster (392ns/op + 1121ns/op), but no > option because it is not thread-safe. > Reusing the Java8-DateTimeFormatter is equivalent (496ns/op + 990ns/op) to > Reusing SimpleDateFormatter (parsing is faster, formatting is slower, avg is > about the same) > And just for completeness: Creating a Java8-DateTimeFormatter, which is > nonsense, because it is immutable and thread-safe. -- This message was sent by Atlassian Jira (v8.3.4#803005)