使用复合组件时,OmniFaces UnmappedResourceHandler 似乎会泄漏资源
OmniFaces UnmappedResourceHandler seems to leak resources when composite components are used
似乎 UnmappedResourceHandler
正在加载资源文件夹中的复合组件 xhtml 文件。结果似乎是逐渐增加的内存泄漏。
可在 FaceletViewHandlingStrategy.metadataCache
内找到泄漏点。
它依赖于哈希图,当使用上述处理程序时,UnmappedResources
用作 CompositeComponentBeanInfo
个实例的键。
如果不使用 UnmappedResourceHandler
,则密钥包含 ResourceImpl
。区别在于 UnmappedResource
不像 ResourceImpl
那样实现 equals()
:
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ResourceImpl resource = (ResourceImpl) o;
return resourceInfo.equals(resource.resourceInfo);
}
所以问题似乎是在第一种情况下 CompositeComponentBeanInfo
一次又一次地添加到 metadataCache
。在第二个中,一切都按预期工作。
还有其他人可以确认这个问题吗?
UnmappedResourceHandler
复合组件的内存泄漏已得到确认,并已由 this commit for 2.1, this commit for 1.11 and this commit 为 1.8.3 解决。
截至今天,所有版本均在 Maven 中可用。
似乎 UnmappedResourceHandler
正在加载资源文件夹中的复合组件 xhtml 文件。结果似乎是逐渐增加的内存泄漏。
可在 FaceletViewHandlingStrategy.metadataCache
内找到泄漏点。
它依赖于哈希图,当使用上述处理程序时,UnmappedResources
用作 CompositeComponentBeanInfo
个实例的键。
如果不使用 UnmappedResourceHandler
,则密钥包含 ResourceImpl
。区别在于 UnmappedResource
不像 ResourceImpl
那样实现 equals()
:
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ResourceImpl resource = (ResourceImpl) o;
return resourceInfo.equals(resource.resourceInfo);
}
所以问题似乎是在第一种情况下 CompositeComponentBeanInfo
一次又一次地添加到 metadataCache
。在第二个中,一切都按预期工作。
还有其他人可以确认这个问题吗?
UnmappedResourceHandler
复合组件的内存泄漏已得到确认,并已由 this commit for 2.1, this commit for 1.11 and this commit 为 1.8.3 解决。
截至今天,所有版本均在 Maven 中可用。