2011-12-08 10 views
1

私のコードでメモリリークが発生する可能性があります。 XML形式のメッセージを受け取り、データベースに書き込むシンプルなWebサービスがあります。私は約500Kのメッセージを処理した後、メモリ不足のエラーでアプリケーションが終了することに気付きました。急な学習曲線の後、私は実行中のアプリケーションをプロファイリングして、Webサービスの実装オブジェクトがサービスの呼び出しごとにヒープ上に保持されていることを非常に迅速に発見しました。私のコードが原因であった可能性を減らすために、何もしないで返すように実装を変更しました。しかし、ヒープは成長を続けました。私の環境は、Glassfish 3、CXF 2.4.2、Eclipse(動的Webプロジェクト)です。私は以下のサービスクラスと実装クラスを含んでいます。 50万のメッセージを処理した後、ヒープ上に500,000のHL7ServiceImplがあります。メモリリークの可能性があります。CXF 2.4.2 Glassfish 3

私は本当にこれで迷っていますので、何か助けていただければ幸いです。

import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebService; 

@WebService(name = "HL7Service", targetNamespace = "http://ws.foo.bar.com/") 
public interface HL7Service { 
    @WebMethod(operationName = "submit", action = "urn:Submit") 
    public void submit(@WebParam(name = "msg") String msg); 
} 
import javax.jws.WebService; 

@WebService(targetNamespace = "http://ws.foo.bar.com/", endpointInterface = "com.bar.foo.ws.HL7Service", portName = "HL7ServiceImplPort", serviceName = "HL7ServiceImplService") 
public class HL7ServiceImpl implements HL7Service { 
    public void submit (String msg) { 

    // if (msg == null) 
    //  return ("NAK"); 
    // else 
    //  EventQueue.getInstance().submit(msg); 
    //  
    // return "ACK"; 

     if (msg != null) { // temp 
      // DO nothing 
     } 
    } 
} 
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> 
    <import resource="classpath:META-INF/cxf/cxf.xml" /> 
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 
     <jaxws:endpoint id="hl7service" 
     implementor="com.bar.foo.ws.HL7ServiceImpl" address="/hl7service"> 
     <jaxws:features> 
      <bean class="org.apache.cxf.feature.LoggingFeature" /> 
     </jaxws:features> 
    </jaxws:endpoint> 
</beans> 
+0

サービスを呼び出すときにクライアントコードが正常に切断されていますか? –

+0

あなたがこれに言及した興味深い - クライアントは第三者の製品であり、本質的にメッセージブローカーです。私は本当に切断をテストする方法がわからないのですか?私はそれが接続を "保持"していると思ってクライアントをシャットダウンしようとしました - しかし運はありません。私は、Glassfishテストコンソールを使って手動でサービスに接続できると思います。 – skyman

+0

単に別のクライアントとサービスを打ち、何が起こるかを知ることは良い考えです。がんばろう。 –

答えて

0

他の誰かがこの質問を見つけただけの場合には、[OK]をクリックします。この問題は、GlassfishのネイティブMetro実装とCXFの間の競合に関連しているように見えました。 CXFからMetroへの移行は問題を解決しました。