Featured image of post week02报告

week02报告

week02报告

week02

内存管理

交互关系:方法调用时栈帧入栈,对象在堆中创建,类信息在方法区存储。垃圾回收主要针对堆,方法区卸载类较少发生。

运行结果

值得一提的是,为了使得方法区溢出,我写了一个python脚本,用来生成类。脚本如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
num_classes = 50000

with open("MetaspaceOverflow.java", "w", encoding="utf-8") as f:
    f.write("public class MetaspaceOverflow {\n")
    f.write("    public static void main(String[] args) {\n")
    f.write(f"        for (int i = 0; i < {num_classes}; i++) {{\n")
    f.write("            try {\n")
    f.write("                Class.forName(\"Class_\" + i);\n")
    f.write("            } catch (ClassNotFoundException e) {\n")
    f.write("                e.printStackTrace();\n")
    f.write("            }\n")
    f.write("        }\n")
    f.write("    }\n")
    f.write("}\n\n")

    for i in range(num_classes):
        f.write(f"class Class_{i} {{\n")
        f.write("    private static Object obj = new Object();\n")
        f.write("    public static void method() {}\n")
        f.write("}\n\n")

除此之外,我使用了-XX:MaxMetaspaceSize=1m来限制方法区的大小,方便溢出。

另:希望可以交markdown文件。

保留所有权。
comments powered by Disqus