【发布时间】:2021-09-24 17:21:57
【问题描述】:
我有一个任务是故意模拟 OutOfMemory: Metaspace 错误。我尝试了不同的方法,但没有一个给我需要的结果。有人可以为此分享一个很好的例子吗?
我的第一次尝试(使用 javassist):
static ClassPool classPool = ClassPool.getDefault();
@SneakyThrows
public void task() {
try {
for (int i = 0; ; i++) {
Class cl = classPool.makeClass("task1.Test" + i).toClass();
}
} catch (Error er) {
Runtime.getRuntime().gc();
log.error(er.getMessage());
}
}
gradle.properties 文件中的设置:
org.gradle.jvmargs=-XX:MaxMetaspaceSize=70M
但我有一个错误:
异常:java.lang.OutOfMemoryError 从 线程“main”中的 UncaughtExceptionHandler
我没听懂。
我的第二次尝试:
public void task() {
try {
URL url = new File("D:/classes").toURI().toURL();
URL[] urls = {url};
ClassLoadingMXBean loadingMXBean = ManagementFactory.getClassLoadingMXBean();
List<ClassLoader> classLoaders = new ArrayList<>();
while (true) {
ClassLoader classLoader = new URLClassLoader(urls);
classLoaders.add(classLoader);
classLoader.loadClass("test1.Test1");
log.info("Total: " + loadingMXBean.getTotalLoadedClassCount());
log.info("Active: " + loadingMXBean.getLoadedClassCount());
log.info("Unloaded: " + loadingMXBean.getUnloadedClassCount());
}
} catch (Exception ex) {
log.error(ex + ex.getMessage());
}
}
但它不起作用,IDEA 通知我有法律记忆。
【问题讨论】:
-
你真的能听懂吗? JVM 会为你打印出来,无需捕获和记录。 (也尝试在该状态下做一些事情可能会产生更多错误)
-
我想我刚刚找到了您想要的示例(错误 #4):geeksforgeeks.org/understanding-outofmemoryerror-exception-java
-
它仍然得到同样的错误。如果我应该编写测试来检查所需的异常怎么办,即要求获得 OutOfMemoryError: Metaspace?我能以某种方式抓住它并从中获取信息吗?
-
我有一个任务由谁分配,目的是什么?
标签: java memory out-of-memory