JVM 메모리 부족 으로 프로 세 스 가 죽 었 습 니 다. Native memory allocation (mmap) failed to map
9031 단어 jvm
JVM 메모리 부족 으로 프로 세 스 가 죽 었 습 니 다. Native memory allocation (mmap) failed to map
한 서버 에 많은 JAVA 프로 세 스 가 배 치 된 것 은 이미 마이크로 서비스의 정상 적 인 상태 이지 만, 일부 구덩이 도 있다.
배경, 테스트 서버 의 일부 JAVA 프로 세 스 가 갑자기 종료 되 었 습 니 다. callback 로 그 를 보면 다음 과 같 습 니 다.
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1786867712 bytes for committing reserved memory.
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32 bit mode, the process size limit was hit
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
# Out of Memory Error (os_linux.cpp:2673), pid=28610, tid=139813184919296
#
# JRE version: Java(TM) SE Runtime Environment (8.0_40-b26) (build 1.8.0_40-b26)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.40-b25 mixed mode linux-amd64 compressed oops)
#
서버 의 메모리 부족 으로 인 한 것 이 분명 합 니 다.
메모리 부족
추측: 메모리 부족 분 두 가지 상황
1. JAVA 프로그램 이 사용 하 는 메모리 신청 이 JVM 분 배 를 초과 한 것 으로 추정 되 며, 이 는 던 질 수 밖 에 없습니다.
java. lang. OutOf Memory Error: Java heap space, JAVA 프로 세 스 는 영향 을 주지 않 습 니 다. 다음 에 도 요청 을 받 아 서 비 스 를 제공 할 수 있 습 니 다.
2. JVM 이 운영 체제 처럼 시스템 의 사용 가능 한 메모리 (RSS) 를 초과 하 는 메모리 신청 을 시도 할 때 Liux 는 JAVA 프로 세 스 를 끝내 고 위 와 같은 오 류 를 던 질 것 으로 추정 된다.
이러한 장면 도 흔히 볼 수 있다. 예 를 들 어 16G 메모리 의 서버 에서 두 개의 서 비 스 를 달리 고 두 서 비 스 는 각각 10G 메모 리 를 분배 하 는 것 을 동시에 시작 합 니 다. JVM 의 쓰레기 회수 체 제 는 일반적인 상황 에서 문제 가 없 기 때문에 정상 적 인 서 비 스 를 할 수 있 습 니 다. 두 서비스 가 동시에 사용 해 야 하 는 메모리 가 16G 를 초과 하면 Liux 에 의 해 하나의 서 비 스 를 해 해 해 해 제 될 것 입 니 다.
(비고: JVM 시작 시 - Xmx 등 매개 변 수 를 통 해 분 배 된 메모리 만 영향 을 줍 니 다.
VIRT, 이전 블 로그 'JAVA 프로 세 스 와 Liux 메모리 간 의 크기 관계' 를 참조 하 십시오.
확인:
확인 하 는 것 이 가장 중요 하 다. 위의 것 은 모두 나의 추측 이다.
메모리 가 1G 인 Liux 서버
total used free shared buffers cached
Mem: 984 119 864 0 2 20
-/+ buffers/cache: 97 886
Swap: 2044 45 1999
물리 적 메모리 + swap 에 3G 정도 존재 합 니 다. (886+1999)
JAVA 프로그램 에 가입 합 니 다. JAVA 의 메모리 초과 가 JAVA 의 프로 세 스 를 종료 할 수 있 는 지 관찰 하기 위해 다음 과 같은 디자인 을 생각 합 니 다.
1. 하나의 스 레 드 로 메모리 할당 을 신청 합 니 다.
2. 주 스 레 드 는 생존 상 태 를 계속 보고 합 니 다.
절 차 는 다음 과 같다.
package org.hejinbin.memory.test;
import java.io.IOException;
/**
* JAVA , : size int (1024 * 1024 * size)
*
* @author QQ 277803242( ) 2016.12.29
*/
public class Test {
public static void main(String[] args) throws IOException, InterruptedException {
new Thread(new Runnable() {
public void run() {
try {
// , m
byte[] byteSize = new byte[50];
System.out.print("input want to allocation memory:");
int temp = System.in.read(byteSize);
String sizeStr = new String(byteSize, 0, temp);
int size = Integer.parseInt(sizeStr.trim());
System.out.println(1024 * 1024 * size);
byte[] bt = new byte[1024 * 1024 * size];
System.out.println("succ..allocation: " + size + "m");
// 30 ,
Thread.sleep(1000 * 60 * 30);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
while (true) {
//1
Thread.sleep(1000 * 60);
System.out.println(Thread.currentThread().getId() + ": i‘m alive");
}
}
}
확인 추측 1:
프로그램 을 실행 하고 1000 을 입력 하 십시오.
출력 alive, 추측 1, 메모리 초과 사용 으로 JAVA 프로 세 스 가 죽지 않 음 을 증명 합 니 다.
확인 추측 2:
창 열기 1, 실행, 입력
root@ubuntu:/home/hejinbin# java -Xmx3048m -Xms3048m org.hejinbin.memory.test.Test
input want to allocation memory:
창 열기 2, 실행, 입력
root@ubuntu:/home/hejinbin# java -Xmx3048m -Xms3048m org.hejinbin.memory.test.Test
input want to allocation memory:
그리고 창 1 에 1500 을 입력 하 세 요.
다음 과 같이 실행:
input want to allocation memory:1500
succ..allocation: 1500m
그리고 창 2 에 1500 을 입력 하 세 요.
input want to allocation memory:1500
succ..allocation: 1500m
창 1 의 JAVA 프로 세 스 가 죽 임 을 발 견 했 습 니 다. 아래 와 같 습 니 다.
root@ubuntu:/home/hejinbin# java -Xmx3048m -Xms3048m org.hejinbin.memory.test.Test
input want to allocation memory:1500
succ..allocation: 1500m
Killed
추측
결론: 현재 마이크로 서비스 가 유행 하고 있 습 니 다. 많은 프로 세 스 가 한 서버 에서 동시에 달리 고 있 습 니 다. JAVA 에 분 배 된 메모리 와 서버 의 사용 가능 한 메모리 안에 만 있 습 니 다. 그렇지 않 으 면 갑자기 Liux 에 의 해 프로 세 스 가 해 제 될 수 있 습 니 다.
마지막 으로 왜 내 프로 세 스 가 killed 된 후에 hs err pid *. log 로 그 를 만 들 지 않 았 을 까?
다음으로 이동:http://www.mamicode.com/info-detail-1663276.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 문자열 풀우리는 Java에서 문자열이 힙 메모리 영역에 저장된다는 것을 알고 있습니다. 이 힙 메모리 내부에는 String Pool이라는 특정 메모리 영역이 있습니다. 문자열 프리미티브를 생성하면 자바 문자열의 불변성 덕분에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.