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
>

Reply via email to