Axis2の非同期送信についてご質問があります。
以下のソースでシンプルなサービス(文字列を返すだけのサービス)に対して
Axis2の非同期送信を利用してn回繰り返し実行するようなクライアントプログラムを作成しております。
想定では、n回ログを出力後、正常終了すると思っていましたが、
現在は「java.lang.OutOfMemoryError: unable to create new native thread」と出て異常終了してしまいます。

非同期送信+後処理に関してはAxis2の範疇でスレッド生成→スレッド解放してくれると思ってましたが、実際は違うのでしょうか?

クライアント側のソースでスレッドが解放されない理由等がありましたらご教示いただけると幸いでございます。
※Axis2の非同期送信のスレッド解放ができないのであれば、自前でExecutorServiceを構えて同期送信する方向に切り替えます。。

■サービス側ソースコード

public class Echo {

    public String getEcho( String message ) {
        return message + "Echo!!!";
    }

}

■クライアント側ソースコード

public class EchoTestAsync {

    public int cnt = 0;

    public static void main(String[] args){

        System.out.println( "開始!" );

        System.out.println("Async 処理開始 " + Thread.activeCount());
        EchoTestAsync instance = new EchoTestAsync();
        instance.execute();
        System.out.println("Async 処理終了 " + Thread.activeCount());

        while( instance.getCnt() != 0  ) {

            try {
                Thread.sleep(1000l);
            } catch (InterruptedException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }

        }

        System.out.println( "終了!" );
    }

    public int getCnt() {
        return cnt;
    }

    public void execute(){

        try {

            for(int i=0;i<5000;i++){
                cnt++;

                EchoStub stub = new EchoStub();

                GetEcho req = new GetEcho();

                req.setMessage( "Async" );

                EchoCallbackHandler callback = new EchoCallbackHandler() {
                    @Override
                    public void receiveResultgetEcho(GetEchoResponse result) {
                        System.out.println("Async callback " + result.get_return() );
                        cnt--;
                    }
                    @Override
                    public void receiveErrorgetEcho(Exception e) {
                        System.out.println("Async callback error " + e.getMessage() );
                        cnt--;
                    }
                };

                System.out.println("Async sta " + Thread.activeCount() );

                stub._getServiceClient().getOptions().setTimeOutInMilliSeconds(1000);
                stub.startgetEcho( req, callback );

                System.out.println("Async end " + Thread.activeCount() );

            }

        } catch (AxisFault e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (RemoteException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }

}