课程名称:Java生产环境下性能监控与调优详解
课程章节:第二章
主讲老师:若鱼1919
课程内容:
-XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M 非堆
-Xmx32M -Xms32M 堆
//controller类
public class MemoryController {
//这个实体类随便搞就可以了,只是要达到堆内存溢出的效果
private List<User> userList = new ArrayList<>();
//达到栈内存溢出的效果需要创建类,所以需要有一个创建类的程序,后续带了
private List<Class<?>> classList = new ArrayList<>();
"/heap") (
public String heap(){
int i = 0;
while (true){
userList.add(new User(i++, UUID.randomUUID().toString()));
}
}
"/nonHeap") (
public String nonHeap(){
int i = 0;
while (true){
classList.addAll(Metaspace.createClasses());
}
}
}//创建类对象的类
public class Metaspace extends ClassLoader {
public static List<Class<?>> createClasses() {
// 类持有
List<Class<?>> classes = new ArrayList<Class<?>>();
// 循环1000w次生成1000w个不同的类。
for (int i = 0; i < 10000000; ++i) {
ClassWriter cw = new ClassWriter(0);
// 定义一个类名称为Class{i},它的访问域为public,父类为java.lang.Object,不实现任何接口
cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "Class" + i, null,
"java/lang/Object", null);
// 定义构造函数<init>方法
MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>",
"()V", null, null);
// 第一个指令为加载this
mw.visitVarInsn(Opcodes.ALOAD, 0);
// 第二个指令为调用父类Object的构造函数
mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
"<init>", "()V");
// 第三条指令为return
mw.visitInsn(Opcodes.RETURN);
mw.visitMaxs(1, 1);
mw.visitEnd();
Metaspace test = new Metaspace();
byte[] code = cw.toByteArray();
// 定义类
Class<?> exampleClass = test.defineClass("Class" + i, code, 0, code.length);
classes.add(exampleClass);
}
return classes;
}
}
课程收获:
之前老是遇到内存溢出,其实内存溢出也是分栈内存溢出和堆内存溢出的,不过这次真的是自己动手实现了。
Exception in thread "http-nio-8080-exec-2" java.lang.OutOfMemoryError: Metaspace 栈内存溢出
Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: GC overhead limit exceeded:堆内存溢出
这个创建class的类其实没太懂,我还要再听一遍
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦