2016-05-05 6 views
0

私はこのOutOfMemoryErrorを追跡しようとしていて、本当に悪い時を過ごしています。私のアプリケーションは、アーキテクチャ部分と、Hibernateが作成したデータベースCRUD操作を含むいくつかの基本的なREST WSを公開するモジュールに分割されています。主なアーキテクチャは、プロパティと構成のロギングと管理の唯一の役割を持っています(これはすべてSpringによって処理されます)。OutOfMemoryErrorをトラッキングする

アプリケーションはまだまだ素晴らしいことをしていませんが、Tomcat 7で2-3回の再デプロイを行った後もOutOfMemoryErrorが発生しています。 []の周り

enter image description here

あなたが見ることができるように、私は文字列の多くを抱えている、[] char型とバイト:私は、ヒープ・ダンプを行い、VisualVMのでそれを開いて、これは私が見たものであるしました。ロガーは、この原因ではない場合、それはいくつかの春/休止状態/ Tomcatに起因する可能性が

@Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
     HttpServletResponse httpServletResponse = (HttpServletResponse) response; 

     Map<String, String> requestMap = this 
       .getTypesafeRequestMap(httpServletRequest); 
     BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(
       httpServletRequest); 
     BufferedResponseWrapper bufferedResponse = new BufferedResponseWrapper(
       httpServletResponse); 

     final StringBuilder logMessage = new StringBuilder(
       "REST Request - ").append("[HTTP METHOD:") 
       .append(httpServletRequest.getMethod()) 
       .append("] [PATH INFO:") 
       .append(httpServletRequest.getRequestURI()) 
       .append("] [REQUEST PARAMETERS:").append(requestMap) 
       .append("] [REQUEST BODY:") 
       .append(bufferedRequest.getRequestBody()) 
       .append("] [REMOTE ADDRESS:") 
       .append(httpServletRequest.getRemoteAddr()).append("]"); 
     long startTime = System.currentTimeMillis(); 
     chain.doFilter(bufferedRequest, bufferedResponse); 
     long elapsed = System.currentTimeMillis() - startTime; 
     logMessage.append(" [RESPONSE:") 
       .append(bufferedResponse.getContent()) 
       .append("] [ELAPSED TIME:").append(elapsed).append("ms]"); 
     log.debug(logMessage.toString()); 
} 

:本当にこの種のデータを操作するだけで、クラスは、サーブレット・フィルターはこれだけをやっているロガーです/私が気付いていないいくつかの図書館?

Springの設定と同じように他のものが必要な場合は、お気軽にお問い合わせください。

ありがとうございました!

+0

tomcatのメモリ設定(Xmx、PermSize)は何ですか? –

+0

起動時にアプリケーションサーバーとしてのTomcatを使用しているときに、Webアプリケーション用にさらにメモリを割り当てようとしましたか?また、「dominatorオブジェクト」が多数の参照を作成して保持しているかどうかを調べるようにしてください(私はHibernateが原因である場合に遭遇しました)。 – dumitru

答えて

0

この問題は、JEE Webアプリケーションのホット再デプロイに関連しています。 TomcatではなくJEEサーブレットコンテナ上にあります。

ここでそれのために良い説明があります:あなたが見ることができるように、私は文字列の多くを抱えている

What makes hot deployment a "hard problem"?

+1

リンク専用の回答以外に、そのブログ投稿はかなり古いです。具体的には、Java 8ではもはや存在しないJVMパラメータを設定するように求められ、Java 7は1年以上前から終了しています... – meriton

0

、周りバイト[] [] char型と。この種のデータを実際に操作する唯一のクラスは、サーブレットフィルタであるロガーです。

これは本当に信じがたいことです。ハイバネートエンティティには単一の文字列は含まれず、HTTPリクエストはchar []に格納されず、レスポンスは決してバッファされません。

文字列は、クラスパス内のほぼすべてのライブラリで使用されるような遍在型のデータ型ですそのトリックは、どのライブラリがそれらを漏らしているのか、そしてその理由を見つけることです。

ヒープダンプを効果的に解析するには、オブジェクトの数をリストするだけでなく、オブジェクト参照のグラフを分析して、どのオブジェクトがそれらの文字列を存続させているかを調べるツールを使用する必要があります。ほとんどの市販のメモリプロファイルはこれを非常によくしています。それを避けて、オープンソースEclipse Memory Analyzerもかなり良いです。私が最後に使用してからしばらくしていましたが、最後のメモリリークでは、MATの標準リーク疑惑レポートが、OutOfMemoryErrorを引き起こしたオブジェクトを正しく識別しました。