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으로 인해 발생한 메모리 오버플로를 요약합니다.