Can you give it a try NOT using getCachingProvider() but getCachingProvider(Thread.currentThread().getContextClassLoader())? That's the way it should work I think, no arg version will use the API cached classloader which is not deterministic and can potentially leak this way.
Romain Manni-Bucau @rmannibucau <https://twitter.com/rmannibucau> | Blog <https://blog-rmannibucau.rhcloud.com> | Old Wordpress Blog <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> | LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber <http://www.tomitribe.com> | JavaEE Factory <https://javaeefactory-rmannibucau.rhcloud.com> 2016-07-25 18:09 GMT+02:00 Steve Goldsmith <[email protected]>: > I'm using a distributed configuration, but everything else is pretty much > default. It's a WAR deployment using a @Singleton bean. Here's the code > snip for that: > > cachingProvider = Caching.getCachingProvider(); > log.debug(String.format("cachingProvider: %s", cachingProvider. > getClass())); > // Get cache manager > log.info("Getting cache manager"); > // Should we use default getCacheManager? > if (config.getBoolean("defaultGetCacheManager")) { > cacheManager = cachingProvider.getCacheManager(); > log.debug("Using getCacheManager()"); > } else { > cacheManager = cachingProvider.getCacheManager(new > File(config. > getString("cacheConfigFile")).toURI(), null, null); > } > log.info("Creating caches"); > cacheManager.createCache("customerStbData", > new MutableConfiguration().setStoreByValue(false). > setStatisticsEnabled(true).setManagementEnabled(true). > setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf( > new Duration(TimeUnit.MINUTES, config.getInt( > "customerStbDataExpireMin"))))); > cacheManager.createCache("recordedEvents", > new MutableConfiguration().setStoreByValue(false). > setStatisticsEnabled(true).setManagementEnabled(true). > setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf( > new Duration(TimeUnit.MINUTES, config.getInt( > "recordedEventsExpireMin"))))); > cacheManager.createCache("scheduledEvents", > new MutableConfiguration().setStoreByValue(false). > setStatisticsEnabled(true).setManagementEnabled(true). > setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf( > new Duration(TimeUnit.MINUTES, config.getInt( > "scheduledEventsExpireMin"))))); > > And the config: > > <?xml version="1.0" encoding="UTF-8"?> > <!-- > ~ Copyright (c) 2008-2015, Hazelcast, Inc. All Rights Reserved. > ~ > ~ Licensed under the Apache License, Version 2.0 (the "License"); > ~ you may not use this file except in compliance with the License. > ~ You may obtain a copy of the License at > ~ > ~ http://www.apache.org/licenses/LICENSE-2.0 > ~ > ~ Unless required by applicable law or agreed to in writing, software > ~ distributed under the License is distributed on an "AS IS" BASIS, > ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > ~ See the License for the specific language governing permissions and > ~ limitations under the License. > --> > > <!-- > The default Hazelcast configuration. This is used when no hazelcast.xml > is present. > Please see the schema for how to configure Hazelcast at > https://hazelcast.com/schema/config/hazelcast-config-3.6.xsd > or the documentation at https://hazelcast.org/documentation/ > --> > <hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config > hazelcast-config-3.6.xsd" > xmlns="http://www.hazelcast.com/schema/config" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> > <group> > <name>dev</name> > <password>dev-pass</password> > </group> > <management-center enabled="false">http://localhost:8080/mancenter > </management-center> > <network> > <port auto-increment="false" port-count="100">8000</port> > <outbound-ports> > <!-- > Allowed port range when connecting to other nodes. > 0 or * means use system provided port. > --> > <ports>0</ports> > </outbound-ports> > <join> > <multicast enabled="false"> > <multicast-group>224.2.2.3</multicast-group> > <multicast-port>54327</multicast-port> > </multicast> > <tcp-ip enabled="true"> > <member-list> > <member>127.0.0.1</member> > </member-list> > </tcp-ip> > <aws enabled="false"> > <access-key>my-access-key</access-key> > <secret-key>my-secret-key</secret-key> > <!--optional, default is us-east-1 --> > <region>us-west-1</region> > <!--optional, default is ec2.amazonaws.com. If set, region > shouldn't be set as it will override this property --> > <host-header>ec2.amazonaws.com</host-header> > <!-- optional, only instances belonging to this group will > be discovered, default will try all running instances --> > <security-group-name>hazelcast-sg</security-group-name> > <tag-key>type</tag-key> > <tag-value>hz-nodes</tag-value> > </aws> > <discovery-strategies> > </discovery-strategies> > </join> > <interfaces enabled="false"> > <interface>10.10.1.*</interface> > </interfaces> > <ssl enabled="false"/> > <socket-interceptor enabled="false"/> > <symmetric-encryption enabled="false"> > <!-- > encryption algorithm such as > DES/ECB/PKCS5Padding, > PBEWithMD5AndDES, > AES/CBC/PKCS5Padding, > Blowfish, > DESede > --> > <algorithm>PBEWithMD5AndDES</algorithm> > <!-- salt value to use when generating the secret key --> > <salt>thesalt</salt> > <!-- pass phrase to use when generating the secret key --> > <password>thepass</password> > <!-- iteration count to use when generating the secret key --> > <iteration-count>19</iteration-count> > </symmetric-encryption> > </network> > <partition-group enabled="false"/> > <executor-service name="default"> > <pool-size>16</pool-size> > <!--Queue capacity. 0 means Integer.MAX_VALUE.--> > <queue-capacity>0</queue-capacity> > </executor-service> > <queue name="default"> > <!-- > Maximum size of the queue. When a JVM's local queue size > reaches the maximum, > all put/offer operations will get blocked until the queue size > of the JVM goes down below the maximum. > Any integer between 0 and Integer.MAX_VALUE. 0 means > Integer.MAX_VALUE. Default is 0. > --> > <max-size>0</max-size> > <!-- > Number of backups. If 1 is set as the backup-count for example, > then all entries of the map will be copied to another JVM for > fail-safety. 0 means no backup. > --> > <backup-count>1</backup-count> > > <!-- > Number of async backups. 0 means no backup. > --> > <async-backup-count>0</async-backup-count> > > <empty-queue-ttl>-1</empty-queue-ttl> > </queue> > <map name="default"> > <!-- > Data type that will be used for storing recordMap. > Possible values: > BINARY (default): keys and values will be stored as binary data > OBJECT : values will be stored in their object forms > NATIVE : values will be stored in non-heap region of JVM > --> > <in-memory-format>BINARY</in-memory-format> > > <!-- > Number of backups. If 1 is set as the backup-count for example, > then all entries of the map will be copied to another JVM for > fail-safety. 0 means no backup. > --> > <backup-count>1</backup-count> > <!-- > Number of async backups. 0 means no backup. > --> > <async-backup-count>0</async-backup-count> > <!-- > Maximum number of seconds for each entry to stay in the map. > Entries that are > older than <time-to-live-seconds> and not updated for > <time-to-live-seconds> > will get automatically evicted from the map. > Any integer between 0 and Integer.MAX_VALUE. 0 means infinite. > Default is 0. > --> > <time-to-live-seconds>0</time-to-live-seconds> > <!-- > Maximum number of seconds for each entry to stay idle in the > map. Entries that are > idle(not touched) for more than <max-idle-seconds> will get > automatically evicted from the map. Entry is touched if get, > put or containsKey is called. > Any integer between 0 and Integer.MAX_VALUE. 0 means infinite. > Default is 0. > --> > <max-idle-seconds>0</max-idle-seconds> > <!-- > Valid values are: > NONE (no eviction), > LRU (Least Recently Used), > LFU (Least Frequently Used). > NONE is the default. > --> > <eviction-policy>NONE</eviction-policy> > <!-- > Maximum size of the map. When max size is reached, > map is evicted based on the policy defined. > Any integer between 0 and Integer.MAX_VALUE. 0 means > Integer.MAX_VALUE. Default is 0. > --> > <max-size policy="PER_NODE">0</max-size> > <!-- > When max. size is reached, specified percentage of > the map will be evicted. Any integer between 0 and 100. > If 25 is set for example, 25% of the entries will > get evicted. > --> > <eviction-percentage>25</eviction-percentage> > <!-- > Minimum time in milliseconds which should pass before checking > if a partition of this map is evictable or not. > Default value is 100 millis. > --> > <min-eviction-check-millis>100</min-eviction-check-millis> > <!-- > While recovering from split-brain (network partitioning), > map entries in the small cluster will merge into the bigger > cluster > based on the policy set here. When an entry merge into the > cluster, there might an existing entry with the same key > already. > Values of these entries might be different for that same key. > Which value should be set for the key? Conflict is resolved by > the policy set here. Default policy is > PutIfAbsentMapMergePolicy > > There are built-in merge policies such as > com.hazelcast.map.merge.PassThroughMergePolicy; entry will be > overwritten if merging entry exists for the key. > com.hazelcast.map.merge.PutIfAbsentMapMergePolicy ; entry will > be added if the merging entry doesn't exist in the cluster. > com.hazelcast.map.merge.HigherHitsMapMergePolicy ; entry with > the higher hits wins. > com.hazelcast.map.merge.LatestUpdateMapMergePolicy ; entry with > the latest update wins. > --> > > > <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy> > > <!-- > Control caching of de-serialized values. Caching makes query > evaluation faster, but it cost memory. > Possible Values: > NEVER: Never cache deserialized object > INDEX-ONLY: Caches values only when they are > inserted into an index. > ALWAYS: Always cache deserialized values. > --> > <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values> > > </map> > > <multimap name="default"> > <backup-count>1</backup-count> > <value-collection-type>SET</value-collection-type> > </multimap> > > <list name="default"> > <backup-count>1</backup-count> > </list> > > <set name="default"> > <backup-count>1</backup-count> > </set> > > <jobtracker name="default"> > <max-thread-size>0</max-thread-size> > <!-- Queue size 0 means number of partitions * 2 --> > <queue-size>0</queue-size> > <retry-count>0</retry-count> > <chunk-size>1000</chunk-size> > <communicate-stats>true</communicate-stats> > > > <topology-changed-strategy>CANCEL_RUNNING_OPERATION</topology-changed-strategy> > </jobtracker> > > <semaphore name="default"> > <initial-permits>0</initial-permits> > <backup-count>1</backup-count> > <async-backup-count>0</async-backup-count> > </semaphore> > > <reliable-topic name="default"> > <read-batch-size>10</read-batch-size> > <topic-overload-policy>BLOCK</topic-overload-policy> > <statistics-enabled>true</statistics-enabled> > </reliable-topic> > > <ringbuffer name="default"> > <capacity>10000</capacity> > <backup-count>1</backup-count> > <async-backup-count>0</async-backup-count> > <time-to-live-seconds>30</time-to-live-seconds> > <in-memory-format>BINARY</in-memory-format> > </ringbuffer> > > <serialization> > <portable-version>0</portable-version> > </serialization> > > <services enable-defaults="true"/> > > <lite-member enabled="false"/> > </hazelcast> > > > On Mon, Jul 25, 2016 at 11:55 AM, Romain Manni-Bucau < > [email protected]> > wrote: > > > Hi, > > > > depends the hz config I think and if you used the right classloader to > > create the cache (think hazelcast doesn't use TCCL by default) > > > > > > Romain Manni-Bucau > > @rmannibucau <https://twitter.com/rmannibucau> | Blog > > <https://blog-rmannibucau.rhcloud.com> | Old Wordpress Blog > > <http://rmannibucau.wordpress.com> | Github < > > https://github.com/rmannibucau> | > > LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber > > <http://www.tomitribe.com> | JavaEE Factory > > <https://javaeefactory-rmannibucau.rhcloud.com> > > > > 2016-07-25 17:09 GMT+02:00 sgjava <[email protected]>: > > > > > I'm using Hazelcast 3.6.4 as a JCache provider under TomEE 7. Using > MAT I > > > see > > > One instance of "com.hazelcast.cache.impl.CacheService" loaded by > > > "java.net.URLClassLoader @ 0x805b5050" occupies 162,660,400 (71.07%) > > bytes. > > > The memory is accumulated in one instance of > > > "com.hazelcast.cache.impl.CachePartitionSegment[]" loaded by > > > "java.net.URLClassLoader @ 0x805b5050". > > > > > > Using javax.cache MBean I can see CacheRemovals is 0, but > CacheEvictions > > is > > > 207,315. Is this normal behavior (not freeing the memory unless it's > > needed > > > perhaps)? I'm have 2G reserved for heap and the server is using about > 250 > > > MB > > > on the low end. It has doubled in size over 5 or 6 days and I only have > > one > > > item that caches for 24 hours with a 30% hit ratio. > > > > > > > > > > > > -- > > > View this message in context: > > > > > > http://tomee-openejb.979440.n4.nabble.com/Heap-leak-as-JCache-provider-tp4679471.html > > > Sent from the TomEE Users mailing list archive at Nabble.com. > > > > > > > > > -- > Steven P. Goldsmith >
