자바 의 -- 메모리 넘 침 사례
오늘 은 자바 메모리 가 넘 치 는 글 을 보 내 드 리 겠 습 니 다. 자, 더 이상 말 하지 않 겠 습 니 다. 우 리 는 바로 주제 에 들 어 갑 니 다.
1. 주요 구조 정의
우선, 우 리 는 BlowUpJVM 이라는 종 류 를 만 들 었 고 모든 사례 실험 은 이런 종 류 를 바탕 으로 진행 되 었 다.
public class BlowUpJVM {
}
2. 스 택 깊이 넘 침
public static void testStackOverFlow(){
BlowUpJVM.testStackOverFlow();
}
스 택 이 계속 돌아 오고 처리 하지 않 았 기 때문에 가상 컴퓨터 스 택 은 계속 깊이 들 어가 고 스 택 의 깊이 는 이렇게 넘 쳤 다.3. 영구 세대 메모리 넘 침
public static void testPergemOutOfMemory1(){
//
List list = new ArrayList();
while(true){
list.add(UUID.randomUUID().toString().intern());
}
}
String 상수 탱크 를 가득 채 우려 고 했 는데 실패 할 줄 은 몰 랐 습 니 다. JDK 1.7 후 상수 탱크 를 더미 에 넣 어도 쓰레기 수 거 를 할 수 있 습 니 다.그리고 다른 방식 으로 cglib 를 사용 하여 Class 로 오래된 연 대 를 가득 채 웁 니 다.
public static void testPergemOutOfMemory2(){
try {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOM.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
catch (Exception e){
e.printStackTrace();
}
}
가상 컴퓨터 가 성공 적 으로 메모리 가 넘 쳤 습 니 다. 그러면 JDK 동적 에이전트 가 발생 하 는 클래스 가 넘 칠 수 있 습 니까?public static void testPergemOutOfMemory3(){
while(true){
final OOM oom = new OOM();
Proxy.newProxyInstance(oom.getClass().getClassLoader(), oom.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(oom, args);
return result;
}
});
}
}
사실 에 따 르 면 JDK 동적 에이전트 열등생 의 클래스 는 메모리 가 넘 치지 않 습 니 다. 그 이 유 는 JDK 동적 에이전트 가 발생 하 는 클래스 정 보 는 영구적 인 세대 에 넣 지 않 고 쌓 여 있 기 때 문 입 니 다.4. 로 컬 방법 스 택 넘 침
public static void testNativeMethodOutOfMemory(){
int j = 0;
while(true){
Printer.println(j++);
ExecutorService executors = Executors.newFixedThreadPool(50);
int i=0;
while(i++<10){
executors.submit(new Runnable() {
public void run() {
}
});
}
}
}
이 원 리 는 스 레 드 풀 을 계속 만 드 는 것 이다. 모든 스 레 드 풀 은 10 개의 스 레 드 를 만 드 는 것 이다. 이런 스 레 드 풀 은 모두 현지 방법 구역 에 있 고 시간 이 지나 면 현지 방법 구역 이 넘 쳐 난다.5. JVM 스 택 메모리 넘 침
public static void testStackOutOfMemory(){
while (true) {
Thread thread = new Thread(new Runnable() {
public void run() {
while(true){
}
}
});
thread.start();
}
}
스 레 드 의 생 성 은 JVM 스 택 에서 직접 생 성 됩 니 다. 그러나 이 예 에서 메모리 가 넘 치 는 것 을 보지 못 했 습 니 다. 호스트 가 먼저 끊 었 습 니 다. JVM 이 끊 은 것 이 아니 라 정말 호스트 가 끊 었 습 니 다. mac 에서 든 windows 에서 든 모두 끊 었 습 니 다.따뜻 한 힌트, 이거 진짜 죽 어.
6. 넘 침
public static void testOutOfHeapMemory(){
List list = new ArrayList();
while(true){
StringBuffer B = new StringBuffer();
for(int i = 0 ; i < 10000 ; i++){
B.append(i);
}
list.add(B);
}
}
새로 추 가 된 StringBuffer 대상 을 계속 쌓 아 올 리 면 바로 넘 칩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.