[ 
https://issues.apache.org/jira/browse/JENA-901?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14371700#comment-14371700
 ] 

ASF GitHub Bot commented on JENA-901:
-------------------------------------

Github user afs commented on a diff in the pull request:

    https://github.com/apache/jena/pull/44#discussion_r26859236
  
    --- Diff: jena-core/src/main/java/com/hp/hpl/jena/util/BoundedLRUMap.java 
---
    @@ -0,0 +1,58 @@
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements.  See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership.  The ASF licenses this file
    + * to you 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.
    + *
    +*/
    +package com.hp.hpl.jena.util;
    +
    +import java.util.LinkedHashMap;
    +import java.util.Map;
    +
    +/**
    + * Bounded Map with a maximum size.
    + * <p>
    + * On insertion of entries beyond the maximum size, the eldest accessed 
entry is
    + * removed.
    + * 
    + * @param <K>
    + *            Type of keys
    + * @param <V>
    + *            Type of values
    + */
    +public class BoundedLRUMap<K,V> extends LinkedHashMap<K, V> implements 
Map<K,V> {          
    +   
    +   private static final long serialVersionUID = -1424511852972661771L;
    +   private int maxEntries;
    +
    +   /**
    +    * Construct a BoundedLRUMap
    +    * 
    +    * @param maxEntries Maximum number of entries
    +    */
    +   public BoundedLRUMap(int maxEntries) {
    +           super(Math.max(maxEntries/16, 16), 0.75f, true);
    +           if (maxEntries <= 0) {
    +                   throw new IllegalArgumentException("maxEntries <= 0");
    +           }
    +           this.maxEntries = maxEntries;
    +   }
    +
    +   @Override
    +   protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
    +           return size() > maxEntries;
    +   }
    +}
    --- End diff --
    
    Seems to duplicate existing oaj.atlas.lib.cache.CacheLRU.  At a minimum 
move and use that once so it is then findable for any later upgrade to Guava 
rather than leave yet another separate cache implementation around. Better 
still the cache discussion on the dev@ list. Putting in ad-hoc fixes drives up 
the long term maintence overhead.


> Make the cache of LPBRuleEngine bounded to avoid out-of-memory
> --------------------------------------------------------------
>
>                 Key: JENA-901
>                 URL: https://issues.apache.org/jira/browse/JENA-901
>             Project: Apache Jena
>          Issue Type: Improvement
>          Components: Reasoners
>    Affects Versions: Jena 2.12.1
>            Reporter: Jan De Beer
>
> The class "com.hp.hpl.jena.reasoner.rulesys.impl.LPBRuleEngine" uses an 
> in-memory cache named "tabledGoals", which has no limit as to the size/number 
> of entries stored.
> {noformat}
>     /** Table mapping tabled goals to generators for those goals.
>      *  This is here so that partial goal state can be shared across multiple 
> queries. */
>     protected HashMap<TriplePattern, Generator> tabledGoals = new HashMap<>();
> {noformat}
> We have experienced out-of-memory issues because of the cache being filled 
> with millions of entries in just a few days under normal query usage 
> conditions and a heap memory set to 3GB.
> In our setup, we have a dataset containing multiple graphs, some of them are 
> actual data graphs (backed by TDB), and then there are two which are ontology 
> models using a "TransitiveReasoner" and an "OWLMicroFBRuleReasoner", 
> respectively. A typical query may run over all the graphs in the dataset, 
> including the ontology ones (see below for a query template). Eventhough the 
> ontology graphs would not yield any additional results for data queries 
> (which is fine), the above mentioned cache would still fill up with new 
> entries.
> {noformat}
> SELECT ?p ?o
> WHERE {
>   GRAPH ?g {
>     <some resource of interest> ?p ?o .
>   }
> }
> {noformat}
> As there is no upper bound to the cache, soon or later all available heap 
> memory will be consumed by the cache, giving rise to an out-of-memory 
> criticial error.



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

Reply via email to