Ecwid / consul-api

Java client for Consul HTTP API
Apache License 2.0
416 stars 177 forks source link

Tomcat: ThreadLocal memory leak #152

Closed blacksmith77 closed 6 years ago

blacksmith77 commented 6 years ago

Tomcat complains with probable memory leak when shutting down webapp.

Feb 07, 2017 9:26:14 PM org.apache.catalina.loader.WebappClassLoaderBase checkThreadLocalMapForLeaks SEVERE: The web application [/##1.0.0-beta3] created a ThreadLocal with key of type [com.ecwid.consul.json.GsonFactory$1] (value [com.ecwid.consul.json.GsonFactory$1@6aad22d8]) and a value of type [com.google.gson.Gson] (value [{serializeNulls:falsefactories [Factory[typeHierarchy=com.google.gson.JsonElement,adapter=com.google.gson.internal.bind.TypeAdapters$25@6848d078], com.google.gson.internal.bind.ObjectTypeAdapter$1@5249a3ad, com.google.gson.internal.Excluder@385e0ce0, Factory[type=java.lang.String,adapter=com.google.gson.internal.bind.TypeAdapters$13@3be642d1], Factory[type=java.lang.Integer+int,adapter=com.google.gson.internal.bind.TypeAdapters$7@15838ec5], Factory[type=java.lang.Boolean+boolean,adapter=com.google.gson.internal.bind.TypeAdapters$3@a481313], Factory[type=java.lang.Byte+byte,adapter=com.google.gson.internal.bind.TypeAdapters$5@423937b6], Factory[type=java.lang.Short+short,adapter=com.google.gson.internal.bind.TypeAdapters$6@4b4015ea], Factory[type=java.lang.Long+long,adapter=com.google.gson.internal.bind.TypeAdapters$8@42bc4fe1], Factory[type=java.lang.Double+double,adapter=com.google.gson.Gson$3@5fc4bac3], Factory[type=java.lang.Float+float,adapter=com.google.gson.Gson$4@37a611e5], Factory[type=java.lang.Number,adapter=com.google.gson.internal.bind.TypeAdapters$11@488db4c1], Factory[type=java.lang.Character+char,adapter=com.google.gson.internal.bind.TypeAdapters$12@68ee2976], Factory[type=java.lang.StringBuilder,adapter=com.google.gson.internal.bind.TypeAdapters$16@50110f29], Factory[type=java.lang.StringBuffer,adapter=com.google.gson.internal.bind.TypeAdapters$17@1b831a76], Factory[type=java.math.BigDecimal,adapter=com.google.gson.internal.bind.TypeAdapters$14@3e0d8e7b], Factory[type=java.math.BigInteger,adapter=com.google.gson.internal.bind.TypeAdapters$15@27b1a555], Factory[type=java.net.URL,adapter=com.google.gson.internal.bind.TypeAdapters$18@7f819ecd], Factory[type=java.net.URI,adapter=com.google.gson.internal.bind.TypeAdapters$19@7cd27be1], Factory[type=java.util.UUID,adapter=com.google.gson.internal.bind.TypeAdapters$21@2e7e4c56], Factory[type=java.util.Locale,adapter=com.google.gson.internal.bind.TypeAdapters$24@4cfdfc1], Factory[typeHierarchy=java.net.InetAddress,adapter=com.google.gson.internal.bind.TypeAdapters$20@774b5e63], Factory[type=java.util.BitSet,adapter=com.google.gson.internal.bind.TypeAdapters$2@18293e18], com.google.gson.internal.bind.DateTypeAdapter$1@44e9cdb7, Factory[type=java.util.Calendar+java.util.GregorianCalendar,adapter=com.google.gson.internal.bind.TypeAdapters$23@3ea2233c], com.google.gson.internal.bind.TimeTypeAdapter$1@13b7dacd, com.google.gson.internal.bind.SqlDateTypeAdapter$1@42bfef5d, com.google.gson.internal.bind.TypeAdapters$22@483116c8, com.google.gson.internal.bind.ArrayTypeAdapter$1@67a56731, com.google.gson.internal.bind.TypeAdapters$26@4ae9b8ba, Factory[type=java.lang.Class,adapter=com.google.gson.internal.bind.TypeAdapters$1@779173bd], com.google.gson.internal.bind.CollectionTypeAdapterFactory@4d434655, com.google.gson.internal.bind.MapTypeAdapterFactory@5b08bc00, com.google.gson.internal.bind.JsonAdapterAnnotationTypeAdapterFactory@21e00700, com.google.gson.internal.bind.ReflectiveTypeAdapterFactory@26ce03e0],instanceCreators:{}}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.

is there a way to gracefully shutdown Client and clean ThreadLocal to be used in webapp @ WebListener.contextDestroyed()?

Thanks in advance

vgv commented 6 years ago

I've completely removed using ThreadLocal for GSON instances. Hope it helps!

blacksmith77 commented 6 years ago

It did kelp: tomcat complaints are gone. Thanks for your time!