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

좋은 웹페이지 즐겨찾기