Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory leaks CXF-如果每个请求客户端使用配置有提供程序的总线,则会发生内存泄漏_Memory Leaks_Garbage Collection_Tomcat7_Cxf_Rest Client - Fatal编程技术网

Memory leaks CXF-如果每个请求客户端使用配置有提供程序的总线,则会发生内存泄漏

Memory leaks CXF-如果每个请求客户端使用配置有提供程序的总线,则会发生内存泄漏,memory-leaks,garbage-collection,tomcat7,cxf,rest-client,Memory Leaks,Garbage Collection,Tomcat7,Cxf,Rest Client,CXF组件/s:总线,JAX-RS 影响版本:3.1.0、3.1.6 环境:Redhat Enterprise Linux(圣地亚哥)、OpenJDK 7、Tomcat 7 我们有一个带有REST客户端组件的应用程序,用于调用后端web服务。在我们的例行性能测试中,JProfiler工具显示了在创建ClientProviderFactory实例时填充的大量总线属性条目(带有名为“Bus.providers.set.”的键) public final class ClientProviderFac

CXF组件/s:总线,JAX-RS

影响版本:3.1.0、3.1.6

环境:Redhat Enterprise Linux(圣地亚哥)、OpenJDK 7、Tomcat 7

我们有一个带有REST客户端组件的应用程序,用于调用后端web服务。在我们的例行性能测试中,JProfiler工具显示了在创建ClientProviderFactory实例时填充的大量总线属性条目(带有名为“Bus.providers.set.”的键)

public final class ClientProviderFactory extends ProviderFactory {

    public static ClientProviderFactory createInstance(Bus bus) {
    ...
    factory.setBusProviders();
    ...
}
这些总线属性项似乎在整个6小时运行期间都停留在堆中。事实上,大约100000个条目占据了13MB的堆。 简而言之,GC的发生频率似乎不足以将堆的使用保持在限制范围内


这是某种缺陷还是CXF中缺少必要的配置来优化这些对象的创建/清理?

相关问题似乎是由使用每请求客户端时在总线实例上填充ProviderFactory hashCode条目引起的。因此,如果自应用程序启动以来已进行了N次调用,则将填充N个条目。因此,它占用了巨大的JVM堆,无法及时获得GC,并导致性能问题

尽管针对该缺陷的CXF修复程序将在快照版本3.1.7和3.2.0中提供,但如果您仍坚持使用CXF 3.1.6或更早版本,则可以使用以下变通解决方案。它就像一个符咒

Java代码

public class PurgeFactoryHashcodeInterceptor extends AbstractPhaseInterceptor<Message> { 

    public PurgeFactoryHashcodeInterceptor() { 

        super(Phase.PREPARE_SEND); 
        addBefore(MessageSenderInterceptor.class.getName()); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 

            cleanUpBusProperties(); 
    } 

    @Override 
    public void handleFault(Message message) throws Fault { 

            cleanUpBusProperties(); 
    } 

    private void cleanUpBusProperties() { 

        Bus bus =    SpringContextProvider.getApplicationContext().getBean(Bus.class); 
        Map<String,Object> origBusPropMap = bus.getProperties(); 

        for(Map.Entry<String,Object> busPropEntry : origBusPropMap.entrySet()) { 
            if(busPropEntry.getKey().startsWith("bus.providers.set.")) { 
                origBusPropMap.remove(busPropEntry.getKey()); 
            } 
        } 
    } 
}
公共类PurgeFactoryHashcodeInterceptor扩展了AbstractPhaseInterceptor{
公共PurgeFactoryHashcodeInterceptor(){
超级(阶段准备发送);
addBefore(MessageSenderInterceptor.class.getName());
} 
@凌驾
public void handleMessage(消息消息)抛出错误{
cleanubusproperties();
} 
@凌驾
public void handleFault(消息消息)抛出错误{
cleanubusproperties();
} 
私有void cleanubusproperty(){
Bus Bus=SpringContextProvider.getApplicationContext().getBean(Bus.class);
Map origBusPropMap=bus.getProperties();
对于(Map.Entry-busPropEntry:origBusPropMap.entrySet()){
if(busPropEntry.getKey().startsWith(“bus.providers.set”){
移除(busPropEntry.getKey());
} 
} 
} 
}
弹簧配置


如果使用每请求客户端,则相关问题似乎是由在总线实例上填充ProviderFactory hashCode条目引起的。因此,如果自应用程序启动以来已进行了N次调用,则将填充N个条目。因此,它占用了巨大的JVM堆,无法及时获得GC,并导致性能问题

尽管针对该缺陷的CXF修复程序将在快照版本3.1.7和3.2.0中提供,但如果您仍坚持使用CXF 3.1.6或更早版本,则可以使用以下变通解决方案。它就像一个符咒

Java代码

public class PurgeFactoryHashcodeInterceptor extends AbstractPhaseInterceptor<Message> { 

    public PurgeFactoryHashcodeInterceptor() { 

        super(Phase.PREPARE_SEND); 
        addBefore(MessageSenderInterceptor.class.getName()); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 

            cleanUpBusProperties(); 
    } 

    @Override 
    public void handleFault(Message message) throws Fault { 

            cleanUpBusProperties(); 
    } 

    private void cleanUpBusProperties() { 

        Bus bus =    SpringContextProvider.getApplicationContext().getBean(Bus.class); 
        Map<String,Object> origBusPropMap = bus.getProperties(); 

        for(Map.Entry<String,Object> busPropEntry : origBusPropMap.entrySet()) { 
            if(busPropEntry.getKey().startsWith("bus.providers.set.")) { 
                origBusPropMap.remove(busPropEntry.getKey()); 
            } 
        } 
    } 
}
公共类PurgeFactoryHashcodeInterceptor扩展了AbstractPhaseInterceptor{
公共PurgeFactoryHashcodeInterceptor(){
超级(阶段准备发送);
addBefore(MessageSenderInterceptor.class.getName());
} 
@凌驾
public void handleMessage(消息消息)抛出错误{
cleanubusproperties();
} 
@凌驾
public void handleFault(消息消息)抛出错误{
cleanubusproperties();
} 
私有void cleanubusproperty(){
Bus Bus=SpringContextProvider.getApplicationContext().getBean(Bus.class);
Map origBusPropMap=bus.getProperties();
对于(Map.Entry-busPropEntry:origBusPropMap.entrySet()){
if(busPropEntry.getKey().startsWith(“bus.providers.set”){
移除(busPropEntry.getKey());
} 
} 
} 
}
弹簧配置



如果你遇到同样的问题,别忘了投票支持我。如果你遇到同样的问题,别忘了投票支持我。