JVM 메모리 누수 시뮬레이션
16418 단어 jvm
asm 의존
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
클래스 생성
package com.example.demo.test;
import java.util.ArrayList;
import java.util.List;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
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);
//
MethodVisitor mw = cw.visitMethod(Opcodes.ACC_PUBLIC, "" ,
"()V", null, null);
// this
mw.visitVarInsn(Opcodes.ALOAD, 0);
// Object
mw.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object",
"" , "()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;
}
}
장면 시뮬레이션
package com.example.demo.test;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@RestController
public class TestController {
private List<User> userList = new ArrayList<>();
private List<Class<?>> classList = new ArrayList<Class<?>>();
/**
* -Xms32M -Xmx32M
* Exception in thread "http-nio-8080-exec-1" java.lang.OutOfMemoryError: GC overhead limit exceeded
*/
@GetMapping("/heap")
public void heap(){
int i = 0;
while (true){
userList.add(new User(i++, UUID.randomUUID().toString()));
}
}
/**
* -XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
* Exception in thread "http-nio-8080-exec-1" java.lang.OutOfMemoryError: Metaspace
*/
@GetMapping("/nonHeap")
public void nonHeap(){
int i = 0;
while (true){
classList.addAll(MetaSpace.createClasses());
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.