2012-12-19 4 views
12

jarファイルを動的にロードするために、子優先のUrlClassLoaderがあります。次に、ロードされたjarファイル内のメソッドを呼び出すためのリフレクションを行います。終了したら、クラスローダーをアンロードすることをお勧めします。次に、ストレステストコードを実行して、コードがスムーズに実行されるようにします。基本的に、私がやろうとしているのは、ループ文の中でjarをロードしてアンロードすることです。ここに私のコードは次のとおりです。私はclassLoader.close();声明なしで、JDK1.6の下にこのコードを実行している場合はJDK1.7 ClassLoaderメモリリーク

for (int i = 0; i < 1000; i++) { 
     //Just to show the progress 
     System.out.println("LOAD NUMBER : " + i); 

     ChildFirstURLClassLoader classLoader = null; 
     try { 
      File file = new File("C:\\library.jar"); 
      String classToLoad = "com.test.MyClass"; 
      URL jarUrl = new URL("file:" + file.getAbsolutePath()); 

      classLoader = new ChildFirstURLClassLoader(new URL[] {jarUrl}, null); 
      Class<?> loadedClass = classLoader.loadClass(classToLoad); 
      Method method = loadedClass.getDeclaredMethod("execute", 
        new Class[] {}); 

      ClassLoader currCl= Thread.currentThread().getContextClassLoader(); 
      Thread.currentThread().setContextClassLoader(classLoader); 
      method.invoke(null); 
      Thread.currentThread().setContextClassLoader(currCl); 

      method = null; 
      loadedClass = null; 
     } finally { 
      if (classLoader != null) { 
       classLoader.close(); 
       classLoader = null; 
      } 
     } 
    } 

、そのコードは完全に実行されます。しかし、JDK1.7に切り替えると、時々java.lang.OutOfMemoryError: PermGen spaceというエラーが出ます。残念ながら、それは一貫性のない方法で発生します。

+2

最大パーマネントを低く設定した方が頻繁に発生するかどうかを確認することができます。これが起こらない場合、Java 6の最大値が同じであることを確認することもできます。 –

+3

com.test.MyClassクラスは何をしますか? Java 7には変更があったため、保留中のファイナライズメソッドによってクラスの割り当てが解除されることはありませんでした。多分、あなたがここで見ている問題です。 OutOfMemoryにヒープ・ダンプを作成し、MemoryAnalyzer(または同様のツール)にロードし、クラス・ローダーをリストし、それらの参照を検索します。 – mihi

+0

PeterとMihiに感謝します。私は最大permgenを増やそうとしましたが、それはまだ同じです。 Java 6では、問題なく64M permgen空間のみで動作します。実際、com.test.MyClassはSpring JDBCを使用してデータベースに問い合わせています。私はすでにヒープ・ダンプを解析しており、クラスローダーへの強い参照がないことがわかりました。皆さんありがとう。 – user1915918

答えて

2

リークの原因を確認する最も簡単な方法は、プロファイラを使用してメモリ使用量を監視することです。 JProfiler、またはVisualVMを試してみてください。これにより、漏れの正確な位置を正確に特定できるようになります。また、それを修正できるかどうか、どのように修正できるかについての手がかりも与えられます。

関連する問題