私はメタスペースOOMをシミュレートしたいです。 、それはjvisualvmに示されている1437に達したときにロードされたクラスの数ストップが増加し、かつ使用メタスペースの大きさが低かったことを奇妙だ、URLClassLoaderでクラスをロードできないのはなぜですか?
package classloader;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
class ClassA {
public void method(String input){}
}
public class ClassMetadataLeakSimulator {
private final static int NB_ITERATIONS_DEFAULT = 50000;
public static void main(String[] args) {
System.out.println("Class metadata leak simulator");
int nbIterations = (args != null && args.length == 1) ? Integer.parseInt(args[0]) : NB_ITERATIONS_DEFAULT;
try {
List<ClassLoader> list = new ArrayList<>();
URL url = new File(".").toURI().toURL();
URL[] urls = new URL[]{url};
System.out.println(url);
for (int i = 0; i < nbIterations; i++) {
URLClassLoader newClassLoader = new URLClassLoader(urls);
list.add(newClassLoader);
newClassLoader.loadClass("classloader.ClassA");
}
}
catch (Throwable any) {
System.out.println("ERROR: " + any);
}
System.out.println("Done!");
}
}
しかし:私は、異なるのURLClassLoaderによってクラスClassA
をロードすることを計画し、ここでコードがありますforループは何百万回も実行されています。新しいURLClassLoaderインスタンスごとにClassAがロードされていないようです。どうして?
私はClassLoaderの新しい人です。カスタマイズされたClassLoaderについての例はありますか?孤立したクラスローダーを作成する方法を意味しますか? – expoter
@expoter隔離されたクラスローダーに関する基本的なハウツーがあります。http://blog.markturansky.com/archives/21 – vsminkov
@expoterしかし、私はクラスを生成する方が簡単だと思います。 cglibエンハンサークラスを見てください。 – vsminkov