ackermander 2017-10-13 11:24 采纳率: 0%
浏览 621

JAX-WS endpoint 发布webservice内存溢出

用jdk 自带的endpoint 发布webservice,发布后内存会溢出,本来以为自己代码问题,但是搞了很久,还是不断溢出,后来写了个最简单的endpoint 测试,开启的时候内存只有20m+,不断请求后内存也不断增大。
简单的webservice
@WebService
public class Ws{
public void a(){
sysout("123");
}
public static void main(String[] args){
Endpoint.publish("http://0.0.0.0:7900/ws", new Ws());
}
}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 00:41
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在使用Java和JAX-WS时,确实可能会遇到内存泄漏的问题。这可能是因为你尝试了过多的并发操作或者你的服务过于复杂导致的。为了解决这个问题,你可以采取以下措施:

    1. 使用EndpointFactoryBean类来创建一个EndpointFactory实例。
    2. 在这个工厂中,你可以设置一些参数,例如maxThreads(最大线程数)和minSpareServers(最少空闲服务器数量),以限制服务端的数量。
    3. 适当减少并发请求的数量,或者采用更有效的并发处理方式。

    以下是修改后的代码示例:

    @WebService(endpointInterface = "com.example.ws.Ws")
    
    public class Ws {
    
        public void a() {
            // 这里可以添加更多复杂的逻辑
            System.out.println("Hello, world!");
        }
    }
    
    @Configuration
    public class AppConfig {
    
        @Bean
        public EndpointFactoryBean wsEndpointFactory() {
            return new EndpointFactoryBean();
        }
    
        @Bean
        public Endpoint endpoint() throws Exception {
            EndpointConfig config = new EndpointConfig();
            config.setPort(7900);
            config.setAddress("http://0.0.0.0:" + config.getPort());
            config.setMaxInflightOperations(1); // 设置最大在线连接数为1
            config.setThreadCount(5); // 设置每个线程的最大并发连接数为5
            config.setMinSpareServers(2); // 设置最小空闲服务器数量为2
            config.setMaxSpareServers(4); // 设置最多空闲服务器数量为4
            EndpointFactoryBean factoryBean = new EndpointFactoryBean(config);
            factoryBean.setTargetObject(this);
            factoryBean.afterPropertiesSet();
    
            return factoryBean.createEndpoint();
        }
    }
    

    在这个例子中,我们设置了maxInflightOperations为1,这意味着只有一个在线连接,这样应该可以避免内存泄漏。此外,我们还设置了threadCountminSpareServersmaxSpareServers,这些参数可以帮助我们控制并发请求的数量。

    评论

报告相同问题?