Java jvm 메모리 오버플로 분석

1. JVM 메모리 오버플로를 분석하는 방법은 무엇입니까?

우리는 Jvm의 메모리, CPU, 스레드 사용량을 모니터링하기 위해 종종 VisualVm을 사용하는데, 일반적으로 메모리의 지속적인 증가를 기반으로 메모리가 존재하는지, 해제되지 않는지를 판단할 수 있습니다. 하지만 항상 지켜볼 수는 없습니다. 여기에는 jvm 힙 메모리 구성이 포함됩니다. 힙 메모리 매개변수 구성 및 튜닝은 다른 장에서 작성됩니다.

실제로 메모리 오버플로가 발생하는 경우 온라인에서 발생할 때 JVm 메모리 오버플로를 구성해야 하며, 이 매개변수 XX:+HeapDumpOnOutOfMemoryError를 온라인으로 구성하는 것이 좋습니다. 그렇지 않으면 온라인 문제를 분석하기 어렵습니다.

-Xms100m -Xmx100m -XX:+HeapDumpOnOutOfMemoryError 

 2. 자체 코드 작성

다음으로 메모리 오버플로 코드를 시뮬레이션합니다. 

@Getter
@Setter
@ToString
public class HeapBean {
    private int userId;
    private String name;
    private String phone;
}
package com.es.Controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class HeapController {

    private List<HeapBean> userlist = new ArrayList<>();
    private Map hashMap=new HashMap<>();

    //堆区内存溢出
    @GetMapping("/heapOom")
    public void heapOverTest() {
        int i = 0;
        while (true) {
            //heaplist.add(new heapBean());
            hashMap.put(i, new HeapBean());
            i++;
        }
    }
}

코드를 로컬로 시작한 다음 실제 주소를 요청하세요.

일정 시간 동안 실행한 후 hprof 파일이 생성됩니다.

java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid16868.hprof ...
Heap dump file created [171733163 bytes in 0.854 secs]
Exception in thread "File Watcher" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.lang.String.toLowerCase(String.java:2647)
	at java.io.WinNTFileSystem.hashCode(WinNTFileSystem.java:640)
	at java.io.File.hashCode(File.java:2132)
	at org.springframework.boot.devtools.filewatch.FileSnapshot.hashCode(FileSnapshot.java:72)
	at java.util.HashMap.hash(HashMap.java:338)
	at java.util.HashMap.put(HashMap.java:611)
	at java.util.HashSet.add(HashSet.java:219)
	at org.springframework.boot.devtools.filewatch.DirectorySnapshot.collectFiles(DirectorySnapshot.java:70)
	at org.springframework.boot.devtools.filewatch.DirectorySnapshot.collectFiles(DirectorySnapshot.java:67)

모든 것을 통해 이 파일을 찾으세요.

 

3. Eclipse 메모리 분석기 도구를 사용해야 합니다.

Eclipse 메모리 분석기(줄여서 MAT)는 메모리 누수를 발견하고 메모리 사용량을 줄이는 데 사용할 수 있는 기능이 풍부하고 작동이 간단한 JVM 힙 덤프 분석 도구입니다.

다운로드하려면 클릭하세요

 "MemoryAnalyzer.exe"를 클릭하여 메모리 분석 도구를 시작합니다.

 java_pid16868.hprof 파일을 엽니다.

빨간색 옵션에 따라 마침을 클릭하여 확인하면 최대 40.5MB가 차지하는 것을 볼 수 있습니다.

아래로 이동하여 특정 점유 클래스를 확인하세요.

세부정보를 클릭하시면 우리의 수업을 보실 수 있습니다.

 계속해서 아래로 내려가 총 객체 수와 점유된 힙 메모리를 확인하세요.

4. 요약 

 HeapControler에서 hashMap으로 인해 발생한 메모리 오버플로를 요약합니다.

추천

출처blog.csdn.net/zy08403/article/details/132759912