Tomcat 8投掷 - org.apache.catalina.webresources.Cache.getResource无法添加资源

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat 8投掷 - org.apache.catalina.webresources.Cache.getResource无法添加资源相关的知识,希望对你有一定的参考价值。

我刚刚将Tomcat从版本7.0.52升级到8.0.14。

我得到了很多静态图像文件:

org.apache.catalina.webresources.Cache.getResource无法将[/base/1325/WA6144-150x112.jpg]上的资源添加到缓存中,因为在驱逐过期的缓存条目后可用空间不足 - 考虑增加最大大小缓存

我没有指定任何特定的资源设置,我没有得到这个7.0.52。

我已经在启动时发现了一个错误报告中提到的这种情况。对我来说,这不是在启动时发生,而是在请求资源时不断发生。

还有其他人有这个问题吗?

试图至少只是禁用缓存,但我找不到如何指定不使用缓存的示例。这些属性已经从Tomcat版本8中的上下文中消失了。尝试添加资源但无法正确配置。

<Resource name="file" 
    cachingAllowed="false"
    className="org.apache.catalina.webresources.FileResourceSet"
/>  

谢谢。

答案

在你的$CATALINA_BASE/conf/context.xml添加块下面</Context>之前

<Resources cachingAllowed="true" cacheMaxSize="100000" />

有关更多信息:http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html

另一答案

从Tomcat 7升级到8时,我遇到了同样的问题:关于缓存的连续大量日志警告。

1. Short Answer

Context$CATALINA_BASE/conf/context.xml xml元素中添加:

<!-- The default value is 10240 kbytes, even when not added to context.xml.
So increase it high enough, until the problem disappears, for example set it to 
a value 5 times as high: 51200. -->
<Resources cacheMaxSize="51200" />

所以默认值是10240(10 mbyte),所以设置一个比这更高的大小。然后调整以获得警告消失的最佳设置。请注意,警告可能会在更高的交通情况下返回。

1.1原因(简短说明)

问题是由于缓存条目小于这些条目的TTL而导致Tomcat无法达到其目标缓存大小。所以Tomcat没有足够的缓存条目可以过期,因为它们太新鲜了,所以它无法释放足够的缓存,从而输出警告。

问题没有出现在Tomcat 7中,因为Tomcat 7在这种情况下根本没有输出警告。 (导致你和我在没有得到通知的情况下使用较差的缓存设置。)

与缓存的大小和TTL相比,在相对较短的时间内收到相对大量的资源HTTP请求(通常是静态)时会出现问题。如果缓存达到其最大值(默认为10mb),其大小的95%以上具有新缓存条目(新缓存意味着缓存中的时间少于5秒),那么您将收到Tomcat尝试的每个webResource的警告消息加载到缓存中。

1.2可选信息

如果需要在正在运行的服务器上调整cacheMaxSize而不重新启动它,请使用JMX。

最快的修复方法是完全禁用缓存:<Resources cachingAllowed="false" />,但这不是最理想的,所以如我刚才所述增加cacheMaxSize。

2. Long Answer

2.1背景资料

WebSource是Web应用程序中的文件或目录。出于性能原因,Tomcat可以缓存WebSource。 maximum of the static resource cache(所有资源总共)默认为10240千字节(10 MB)。在请求webResource时(例如,在加载静态图像时)将webResource加载到缓存中,然后将其称为缓存条目。每个缓存条目都有一个TTL(生存时间),这是允许缓存条目保留在缓存中的时间。当TTL到期时,缓存条目有资格从缓存中删除。 cacheTTL的默认值为5000毫秒(5秒)。

还有更多关于缓存的信息,但这与问题无关。

2.2原因

Cache class的以下代码详细显示了缓存策略:

152  // Content will not be cached but we still need metadata size
153 long delta = cacheEntry.getSize();
154 size.addAndGet(delta);
156 if (size.get() > maxSize) {
157 // Process resources unordered for speed. Trades cache
158 // efficiency (younger entries may be evicted before older
159 // ones) for speed since this is on the critical path for
160 // request processing
161 long targetSize =
162 maxSize * (100 - TARGET_FREE_PERCENT_GET) / 100;
163 long newSize = evict(
164 targetSize, resourceCache.values().iterator());
165 if (newSize > maxSize) {
166 // Unable to create sufficient space for this resource
167 // Remove it from the cache
168 vue+mousedown实现全屏拖动,全屏投掷

投掷硬币,直到一侧连续下降 3 次

Android - ListView 投掷手势触发上下文菜单

模拟投掷硬币100次

hihocoder [Offer收割]编程练习赛14 投掷硬币

如何向滑动 SpriteKit 的方向投掷精灵