嘘~ 正在从服务器偷取页面 . . .

Jvm 专题 OOM


OOM

一、基本认识

OOM 是 OutOfMemoryError 的简写。

学习Java的异常模块时有这么一张图:

Throwable 结构

(图是借用网上的)OutOfMemoryError 在Throwable 结构中属于Error类。

但是引起OOM的原因是多方面的。

二、准备工作

先学习GC信息阅读:

GC 信息解读

主要格式:

[ gc (分配失败) [ 年轻代: 回收前大小 -> 回收后大小 (年轻代总大小)] 回收前堆大小 -> 回收后堆大小 (整个堆大小),  回收耗时 ] [ 用户耗时  系统耗时  实际耗时 ]

[Full gc(发生GC的原因) ] [年轻代: 回收前大小 -> 回收后大小 (年轻代总大小)] [老年代: 回收前大小 -> 回收后大小 (老年代总大小)] 回收前堆大小 -> 回收后堆大小 (整个堆大小), [元空间: 回收前大小 -> 回收后大小 (整个元空间大小), 回收耗时] [用户耗时, 系统耗时, 实际耗时]

主要规律:名称 + GC前内存占用 -> GC后内存占用 (该区内存总大小)

示例如下,为了方面看,把格式大致对齐一下:

Minor GC 或者只写 GC 一般表示年轻代发生的GC行为。

[GC (Allocation Failure) [PSYoungGen: 2008K->480K(2560K)] 8152K->6876K(9728K), 0.0011329 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

[ gc (分配失败) [ 年轻代: 回收前大小 -> 回收后大小 (年轻代总大小)] 回收前堆大小 -> 回收后堆大小 (整个堆大小),  回收耗时 ] [ 用户耗时  系统耗时  实际耗时 ]

Major GC或Full GC: 一般表示老年代发生的GC行为。

[Full GC (Ergonomics) [PSYoungGen: 1545K->1448K(2560K)] [ParOldGen: 6428K->6389K(7168K)] 7973K->7837K(9728K), [Metaspace: 3044K->3044K(1056768K)], 0.0048083 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 

[full gc(发生GC的原因) ] [年轻代: 回收前大小 -> 回收后大小 (年轻代总大小)] [老年代: 回收前大小 -> 回收后大小 (老年代总大小)] 回收前堆大小 -> 回收后堆大小 (整个堆大小), [元空间: 回收前大小 -> 回收后大小 (整个元空间大小), 回收耗时] [用户耗时, 系统耗时, 实际耗时]

Ergonomics在JVM中的垃圾收集器中的含义是负责自动的调解gc暂停时间和吞吐量之间的平。这个发生GC的原因类型有很多,可用大概了解一下:

#include "precompiled.hpp"
#include "gc/shared/gcCause.hpp"

const char* GCCause::to_string(GCCause::Cause cause) {
  switch (cause) {
    case _java_lang_system_gc:
      return "System.gc()";

    case _full_gc_alot:
      return "FullGCAlot";

    case _scavenge_alot:
      return "ScavengeAlot";

    case _allocation_profiler:
      return "Allocation Profiler";

    case _jvmti_force_gc:
      return "JvmtiEnv ForceGarbageCollection";

    case _gc_locker:
      return "GCLocker Initiated GC";

    case _heap_inspection:
      return "Heap Inspection Initiated GC";

    case _heap_dump:
      return "Heap Dump Initiated GC";

    case _wb_young_gc:
      return "WhiteBox Initiated Young GC";

    case _wb_conc_mark:
      return "WhiteBox Initiated Concurrent Mark";

    case _wb_full_gc:
      return "WhiteBox Initiated Full GC";

    case _update_allocation_context_stats_inc:
    case _update_allocation_context_stats_full:
      return "Update Allocation Context Stats";

    case _no_gc:
      return "No GC";

    case _allocation_failure:
      return "Allocation Failure";

    case _tenured_generation_full:
      return "Tenured Generation Full";

    case _metadata_GC_threshold:
      return "Metadata GC Threshold";

    case _metadata_GC_clear_soft_refs:
      return "Metadata GC Clear Soft References";

    case _cms_generation_full:
      return "CMS Generation Full";

    case _cms_initial_mark:
      return "CMS Initial Mark";

    case _cms_final_remark:
      return "CMS Final Remark";

    case _cms_concurrent_mark:
      return "CMS Concurrent Mark";

    case _old_generation_expanded_on_last_scavenge:
      return "Old Generation Expanded On Last Scavenge";

    case _old_generation_too_full_to_scavenge:
      return "Old Generation Too Full To Scavenge";

    case _adaptive_size_policy:
      return "Ergonomics";

    case _g1_inc_collection_pause:
      return "G1 Evacuation Pause";

    case _g1_humongous_allocation:
      return "G1 Humongous Allocation";

    case _dcmd_gc_run:
      return "Diagnostic Command";

    case _last_gc_cause:
      return "ILLEGAL VALUE - last gc cause - ILLEGAL VALUE";

    default:
      return "unknown GCCause";
  }
  ShouldNotReachHere();
}

暂时先深入去探究这个原因,这里之所以列举,只是作为了解。

环境说明

我的环境是jdk1.8,测试工具使用的是idea2020

垃圾收集器可用使用java -XX:+PrintCommandLineFlags -version来进行查看

-XX:InitialHeapSize=265759744 -XX:MaxHeapSize=4252155904 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

-XX:+UseParallelGC 表示使用Parallel Scavenge + Serial Old的收集器组合进行内存回收。

打印GC信息的参数:

-XX:+PrintGCDetails

三、OOM 常见异常

1、Java heap space

OutOfMemeryError:Java heap space 表示java堆空间中的内存溢出。

模拟该异常可以使用 VM options-Xms10m -Xmx10m

Demo 如下:

package com.xiaocai.jvm.oom;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: TODO 功能角色说明:
 * TODO 描述:  模拟 OutOfMemoryError: Java heap space 异常
 *             参数设置 :-Xms10m -Xmx10m -XX:+PrintGCDetails
 * @author: 张小菜
 * @date: 2020/11/3 23:14
 * @version: v1.0
 */
public class JavaHeapSpaceDemo {

    byte[] bytes = new byte[1 * 1024 * 1024];//创建1m大小的字节数组

    public static void main(String[] args) {

        List<JavaHeapSpaceDemo> list = new ArrayList<>();

        while (true){
            JavaHeapSpaceDemo jhdemo = new JavaHeapSpaceDemo();
            System.out.println(jhdemo);
            list.add(jhdemo);
        }

    }
}

结果如下:

“C:\Program Files\Java\jdk1.8.0_191\bin\java.exe...”
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@12bb4df8
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@4cc77c2e
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@7a7b0070
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@39a054a5
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@71bc1ae4
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@6ed3ef1
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@2437c6dc
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.xiaocai.jvm.oom.JavaHeapSpaceDemo.(JavaHeapSpaceDemo.java:15)
    at com.xiaocai.jvm.oom.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:22)

创建了7个对象之后,再创建第8个对象的时候发生了这个异常,添加打印GC信息的参数-XX:+PrintGCDetails

“C:\Program Files\Java\jdk1.8.0_191\bin\java.exe...”
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@12bb4df8
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@4cc77c2e
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@7a7b0070
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@39a054a5
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@71bc1ae4
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@6ed3ef1
[GC (Allocation Failure) [PSYoungGen: 2008K->480K(2560K)] 8152K->6876K(9728K), 0.0011329 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
com.xiaocai.jvm.oom.JavaHeapSpaceDemo@2437c6dc
[GC (Allocation Failure) --[PSYoungGen: 1545K->1545K(2560K)] 7941K->7973K(9728K), 0.0013278 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 1545K->1448K(2560K)] [ParOldGen: 6428K->6389K(7168K)] 7973K->7837K(9728K), [Metaspace: 3044K->3044K(1056768K)], 0.0048083 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) --[PSYoungGen: 1448K->1448K(2560K)] 7837K->7853K(9728K), 0.0006351 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 1448K->1434K(2560K)] [ParOldGen: 6405K->6388K(7168K)] 7853K->7822K(9728K), [Metaspace: 3044K->3044K(1056768K)], 0.0050081 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 PSYoungGen      total 2560K, used 1536K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
  eden space 2048K, 75% used [0x00000000ffd00000,0x00000000ffe80320,0x00000000fff00000)
  from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
  to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
 ParOldGen       total 7168K, used 6388K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
  object space 7168K, 89% used [0x00000000ff600000,0x00000000ffc3d038,0x00000000ffd00000)
 Metaspace       used 3075K, capacity 4556K, committed 4864K, reserved 1056768K
  class space    used 325K, capacity 392K, committed 512K, reserved 1048576K
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.xiaocai.jvm.oom.JavaHeapSpaceDemo.(JavaHeapSpaceDemo.java:15)
    at com.xiaocai.jvm.oom.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:22)

最后的一次普通GC和Ful GC 如下

[GC (Allocation Failure) --[PSYoungGen: 1448K->1448K(2560K)] 7837K->7853K(9728K), 0.0006351 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 1448K->1434K(2560K)] [ParOldGen: 6405K->6388K(7168K)] 7853K->7822K(9728K), [Metaspace: 3044K->3044K(1056768K)], 0.0050081 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

可以看到因为对象一直在创建并且list也一直在使用,无法进行回收任何垃圾。

首先可以看到三区分配:

eden 区:2M,s0和s1分别是512K,年轻代总大小3M,老年代大约7M

根据对象分配策略,1M大小的对象,已经达到了eden区的一半了,会直接进入老年代,1M大小的对象已经属于大对象范畴了,大对象也会直接分配在老年代。

年轻代回收只有微乎其微的14k,老年代回收也只有17k,整堆回收只有31k,而创建一个对象大约需要1M空间,堆空间已经被限制为10M了。

整个GC过程基本上无法回收多少空间,对象在不停的创建,但是没有分配空间了。

2、GC overhead limit exceeded

GC 回收时间过长会抛出此异常。过长的定义是,超过98%的时候用来做GC,并且回收了不到2%的堆内存空间,连续多次GC都回收不到2%的极端极端情况下回抛出该异常,如果不排除该错误,那么GC清理的内存很快会再次填满,不得已再次执行GC,形成恶性循环,CUP使用率飙升,但是GC却没有任何成果。

模拟参数:

-Xms10m -Xmx10m 

Demo :

package com.xiaocai.jvm.oom;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: TODO 功能角色说明:
 * TODO 描述:模拟 OutOfMemoryError: GC overhead limit exceeded 异常
 *           参数:-Xms10m -Xmx10m -XX:+PrintGCDetails
 * @author: 张小菜
 * @date: 2020/11/4 15:34
 * @version: v1.0
 */
public class OverHeadLimitExecededDemo {

    public static void main(String[] args) {
        String string = "i";
        int i=1 ;
        List<String> stringList = new ArrayList<>();
        while (true){

            stringList.add(String.valueOf(i));
            i++;
        }

    }
}

打印信息:

[GC (Allocation Failure) [PSYoungGen: 2048K->496K(2560K)] 2048K->756K(9728K), 0.0026657 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 2544K->507K(2560K)] 2804K->2520K(9728K), 0.0021895 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 2555K->496K(2560K)] 4568K->4322K(9728K), 0.0019448 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 2544K->512K(2560K)] 6370K->6387K(9728K), 0.0025554 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 512K->0K(2560K)] [ParOldGen: 5875K->5879K(7168K)] 6387K->5879K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0600391 secs] [Times: user=0.31 sys=0.00, real=0.06 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2048K->508K(2560K)] [ParOldGen: 5879K->6979K(7168K)] 7927K->7488K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0569162 secs] [Times: user=0.23 sys=0.00, real=0.06 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2048K->2046K(2560K)] [ParOldGen: 6979K->6979K(7168K)] 9027K->9026K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0332405 secs] [Times: user=0.14 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2048K->2047K(2560K)] [ParOldGen: 6979K->6979K(7168K)] 9027K->9027K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0304533 secs] [Times: user=0.23 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6979K->6979K(7168K)] 9027K->9027K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0307883 secs] [Times: user=0.16 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6981K->6981K(7168K)] 9029K->9029K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0300180 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6983K->6983K(7168K)] 9031K->9031K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0327313 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6985K->6985K(7168K)] 9033K->9033K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0321361 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6986K->6986K(7168K)] 9034K->9034K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0323119 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6988K->6988K(7168K)] 9036K->9036K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0312611 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6990K->6990K(7168K)] 9038K->9038K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0325881 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6992K->6992K(7168K)] 9040K->9040K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0323523 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6993K->6993K(7168K)] 9041K->9041K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0323522 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6995K->6995K(7168K)] 9043K->9043K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0310398 secs] [Times: user=0.16 sys=0.02, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6997K->6997K(7168K)] 9045K->9045K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0321808 secs] [Times: user=0.28 sys=0.02, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6999K->6999K(7168K)] 9047K->9047K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0316746 secs] [Times: user=0.19 sys=0.03, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7000K->7000K(7168K)] 9048K->9048K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0314623 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7002K->7002K(7168K)] 9050K->9050K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0313950 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7004K->7004K(7168K)] 9052K->9052K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0323851 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7006K->7006K(7168K)] 9054K->9054K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0320037 secs] [Times: user=0.16 sys=0.02, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7007K->7007K(7168K)] 9055K->9055K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0299812 secs] [Times: user=0.14 sys=0.01, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7009K->7009K(7168K)] 9057K->9057K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0317639 secs] [Times: user=0.19 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7011K->6995K(7168K)] 9059K->9043K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0462129 secs] [Times: user=0.33 sys=0.00, real=0.05 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6997K->6997K(7168K)] 9045K->9045K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0317259 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 6999K->6999K(7168K)] 9047K->9047K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0333549 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7001K->7001K(7168K)] 9049K->9049K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0323367 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7002K->7002K(7168K)] 9050K->9050K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0320521 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7004K->7004K(7168K)] 9052K->9052K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0315693 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7006K->7006K(7168K)] 9054K->9054K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0322276 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7008K->7008K(7168K)] 9056K->9056K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0313146 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7009K->7009K(7168K)] 9057K->9057K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0327120 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7011K->7011K(7168K)] 9059K->9059K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0323557 secs] [Times: user=0.17 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7013K->7013K(7168K)] 9061K->9061K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0321122 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7015K->7015K(7168K)] 9063K->9063K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0316982 secs] [Times: user=0.19 sys=0.02, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7016K->7016K(7168K)] 9064K->9064K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0329905 secs] [Times: user=0.25 sys=0.02, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7018K->7018K(7168K)] 9066K->9066K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0322335 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7020K->7020K(7168K)] 9068K->9068K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0318144 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7022K->7022K(7168K)] 9070K->9070K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0315586 secs] [Times: user=0.20 sys=0.02, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7023K->7023K(7168K)] 9071K->9071K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0315033 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7025K->7025K(7168K)] 9073K->9073K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0315487 secs] [Times: user=0.19 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7027K->7027K(7168K)] 9075K->9075K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0303458 secs] [Times: user=0.17 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7029K->7029K(7168K)] 9077K->9077K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0309470 secs] [Times: user=0.17 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7030K->7030K(7168K)] 9078K->9078K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0327413 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7032K->7032K(7168K)] 9080K->9080K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0313202 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7034K->7034K(7168K)] 9082K->9082K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0325541 secs] [Times: user=0.11 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7036K->7036K(7168K)] 9084K->9084K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0324064 secs] [Times: user=0.23 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7037K->7037K(7168K)] 9085K->9085K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0328188 secs] [Times: user=0.25 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7039K->7039K(7168K)] 9087K->9087K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0306453 secs] [Times: user=0.23 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7041K->7041K(7168K)] 9089K->9089K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0310680 secs] [Times: user=0.20 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7043K->7043K(7168K)] 9091K->9091K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0322437 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7044K->7044K(7168K)] 9092K->9092K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0321177 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7046K->7046K(7168K)] 9094K->9094K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0324405 secs] [Times: user=0.22 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7048K->7048K(7168K)] 9096K->9096K(9728K), [Metaspace: 3048K->3048K(1056768K)], 0.0336217 secs] [Times: user=0.31 sys=0.00, real=0.03 secs] 
[Full GC (Ergonomics) [PSYoungGen: 2047K->0K(2560K)] [ParOldGen: 7078K->582K(7168K)] 9126K->582K(9728K), [Metaspace: 3074K->3074K(1056768K)], 0.0052949 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
Heap
 PSYoungGen      total 2560K, used 65K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
  eden space 2048K, 3% used [0x00000000ffd00000,0x00000000ffd10658,0x00000000fff00000)
  from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
  to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
 ParOldGen       total 7168K, used 582K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
  object space 7168K, 8% used [0x00000000ff600000,0x00000000ff691a58,0x00000000ffd00000)
 Metaspace       used 3080K, capacity 4556K, committed 4864K, reserved 1056768K
  class space    used 325K, capacity 392K, committed 512K, reserved 1048576K
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.lang.Integer.toString(Integer.java:401)
    at java.lang.String.valueOf(String.java:3099)
    at com.xiaocai.jvm.oom.OverHeadLimitExecededDemo.main(OverHeadLimitExecededDemo.java:21)

从GC日志可以看到,从第3次Full GC 以后,堆空间发生了50次的Full GC,并且每次Full GC 基本上都无法回收空间了,最后在第51次Full GC的时候发生直接内存空间溢出错误。

3、Direct buffer memory

直接内存溢出。

直接内存,java8的元空间就是和永久代类似,都是JVM规范中方法区的实现。只是方法区在堆中,而元空间不在JVM中,而是使用的本地内存。因此元空间的大小理论上是受本地内存限制。

-XX:MetaspaceSize=1024m -xx:+PrintFlagsFinal

该故障和NIO相关。

错误现象:

java.lang.OutOfMemoryError: Direct buffer memory

导致原因:

写NIO程序经常使用ByteBuffer来读取或者写入数据,这是一张基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。

这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

ByteBuffer.allcate(capability)第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以毒速度相对较慢。

ByteBuffer.allcateDirect(capability)第二种方式分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝,所以速度相对较快。

如果不断分配本地内存,堆内存就很少使用,那么JVM久不需要执行GC,DirectByteBuffer 对象就不会被回收,这时候堆内存充足,但是本地内存可能用完了,再次尝试分配本地内存就会出现内存溢出java.lang.OutOfMemoryError: Direct buffer memory的错误,程序直接挂了。

直接内存太大,模拟参数时将直接内存调小:

-Xms10m -Xmx10m -XX:MaxDirectMemorySize=5m  -XX:+PrintGCDetails

Demo :

package com.xiaocai.jvm.oom;

import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;

/**
 * @description: TODO 功能角色说明:
 * TODO 描述:模拟 java.lang.OutOfMemoryError: Direct buffer memory 异常
 *        参数设置: -Xms10m -Xmx10m -XX:MaxDirectMemorySize=5m  -XX:+PrintGCDetails
 * @author: 张小菜
 * @date: 2020/11/4 16:04
 * @version: v1.0
 */
public class DirectBufferMemoryDemo {

    public static void main(String[] args) throws InterruptedException {

        System.out.println("初始化配置最大直接内存:"+ (sun.misc.VM.maxDirectMemory() /(double)1024/1024 )+ "mb");
        TimeUnit.SECONDS.sleep(2);
        ByteBuffer buffer = ByteBuffer.allocateDirect(7 * 1024 * 1024);
    }
}

结果:

初始化配置最大直接内存:5.0mb
[GC (Allocation Failure) [PSYoungGen: 2048K->488K(2560K)] 2048K->924K(9728K), 0.0015453 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (System.gc()) [PSYoungGen: 1165K->488K(2560K)] 1601K->1184K(9728K), 0.0010303 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (System.gc()) [PSYoungGen: 488K->0K(2560K)] [ParOldGen: 696K->1000K(7168K)] 1184K->1000K(9728K), [Metaspace: 3759K->3759K(1056768K)], 0.0104178 secs] [Times: user=0.09 sys=0.02, real=0.01 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
    at java.nio.Bits.reserveMemory(Bits.java:694)
    at java.nio.DirectByteBuffer.(DirectByteBuffer.java:123)
    at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
    at com.xiaocai.jvm.oom.DirectBufferMemoryDemo.main(DirectBufferMemoryDemo.java:20)
Heap
 PSYoungGen      total 2560K, used 55K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
  eden space 2048K, 2% used [0x00000000ffd00000,0x00000000ffd0dd48,0x00000000fff00000)
  from space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
  to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
 ParOldGen       total 7168K, used 1000K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
  object space 7168K, 13% used [0x00000000ff600000,0x00000000ff6fa0f0,0x00000000ffd00000)
 Metaspace       used 3790K, capacity 4536K, committed 4864K, reserved 1056768K
  class space    used 419K, capacity 428K, committed 512K, reserved 1048576K

可以看到[Metaspace: 3759K->3759K(1056768K)]空间已经满,并且System.gc()无能为力。

4、Unable to create new native thread

高并发请求时,比较容易出现该异常

java.lang.OutOfMemoryError: Unable to create new native thread

该异常是native thread 本地线程引起的内存异常与对应的平台有关。

主要可能原因:

(1)一个应用进程创建了太多线程,超过了系统承载极限。

(2)服务器不允许应用程序创建这么多线程,linux系统默认允许单个进程可以创建的线程数是1024个,如果应用创建的线程超过这个数量,就会抛出java.lang.OutOfMemoryError: Unable to create new native thread内存溢出错误

解决办法:

(1)降低应用程序创建线程的数量,分析应用是否真的需要创建这么多线程。

(2)对于应用确实需要创建很多线程,远超linux系统默认的线程个数的限制(一般1024个),可以通过修改linux服务器,扩大linux默认限制。

ulimit -a # 查看当前用户各种限制列表  max user process 
ulimit -u # 查看当前用户的线程限制 

Demo :

package com.xiaocai.jvm.oom;

import java.util.concurrent.TimeUnit;

/**
 * @description: TODO 功能角色说明:
 * TODO 描述:
 * @author: 张小菜
 * @date: 2020/11/4 16:19
 * @version: v1.0
 */
public class UnableToCreateNewNativeThreadDemo {

    public static void main(String[] args) {
        int i =1 ;
        while (true){

            new Thread(()->{
                try {
                    TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }
}

该异常的模拟可以将文件放到VM的虚拟机里运行,会出现该异常。

解决办法

发生该异常后Ctrl + C无法退出,需要使用root用户登录之后强制关闭。

ps -ef | grep java
kill -9  对应进程pid

centos 6 位置对应的配置修改文件位置 /etc/security/limits.d/90-nproc.conf

或者 /etc/security/limits.conf

我的Centos 7 配置文件位置是: /etc/security/limits.d/20-nproc.conf

使用cat命令查看

cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited

我的普通用户默认是4096,可见我的CentOS7 是 4096个,我没有修改过。

如果要修改在文件末尾追加一行,比如限制在2048个线程:

vim /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited
username       soft    nproc     2048

5、Metaspace

元空间爆满导致的内存溢出。

java8使用元空间替换了永久代。Metaspace 是方法区在Hotspot 中的实现,它和持久代最大的区别在于:Metaspace 并不在虚拟机内存中,而是使用的本地内存。

永久代/元空间存放:

  • 虚拟机加载的类信息
  • 常量池
  • 静态变量
  • 及时编译后的代码

可以使用命令查看本机的一些初始化参数:

java -XX:+PrintFlagsInitial

执行结果很多就不贴了,找到MetaspaceSize,大约20.8M

MetaspaceSize  = 21810376 

模拟Metaspace 元空间溢出,可以不停的生产类放入元空间,直到耗光全部空间大小。

模拟使用的元空间参数限定元空间大小:

-XX:MetaspaceSize=4M -XX:MaxMetaspaceSize=4m

Demo :

package com.xiaocai.jvm.oom;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @description: TODO 功能角色说明:
 * TODO 描述: 模拟 OutOfMemoryError: Java heap space 异常
 *      参数设置:  -XX:MetaspaceSize=4M -XX:MaxMetaspaceSize=4m -XX:+PrintGCDetails
 * @author: 张小菜
 * @date: 2020/11/4 17:20
 * @version: v1.0
 */
public class MetaSpaceOOMDemo {

    // 静态内部类
    static  class  MetaSpaceOOM{

    }

    public static void main(String[] args) {
        int i = 0 ;//计数器

        try {

            while (true){
                i++;

                Enhancer enhancer = new Enhancer();
                enhancer.setSuperclass(MetaSpaceOOM.class);
                enhancer.setUseCache(false);
                enhancer.setCallback(new MethodInterceptor() {
                    @Override
                    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                        return methodProxy.invokeSuper(o,args);
                    }
                } );
                // 使用cglib代理创建模板类
                enhancer.create();

            }

        } catch (Exception e) {
            System.out.println("----循环了 "+ i + " 次之后异常");
            e.printStackTrace();
        }
    }
}

执行打印结果

[GC (Allocation Failure) [PSYoungGen: 65024K->2818K(75776K)] 65024K->2826K(249344K), 0.0032235 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 67842K->2616K(75776K)] 67850K->2632K(249344K), 0.0035230 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Metadata GC Threshold) [PSYoungGen: 46718K->3112K(75776K)] 46734K->3136K(249344K), 0.0035443 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] 
[Full GC (Metadata GC Threshold) [PSYoungGen: 3112K->0K(75776K)] [ParOldGen: 24K->3022K(97792K)] 3136K->3022K(173568K), [Metaspace: 9138K->9138K(1058816K)], 0.0144094 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Last ditch collection) [PSYoungGen: 0K->0K(103424K)] 3022K->3022K(201216K), 0.0004076 secs] [Times: user=0.00 sys=0.02, real=0.00 secs] 
[Full GC (Last ditch collection) [PSYoungGen: 0K->0K(103424K)] [ParOldGen: 3022K->1571K(188928K)] 3022K->1571K(292352K), [Metaspace: 9138K->9138K(1058816K)], 0.0187070 secs] [Times: user=0.09 sys=0.02, real=0.02 secs] 
[GC (Metadata GC Threshold) [PSYoungGen: 2003K->128K(117760K)] 3575K->1699K(306688K), 0.0005350 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Metadata GC Threshold) [PSYoungGen: 128K->0K(117760K)] [ParOldGen: 1571K->1572K(297984K)] 1699K->1572K(415744K), [Metaspace: 9138K->9138K(1058816K)], 0.0242529 secs] [Times: user=0.11 sys=0.00, real=0.02 secs] 
[GC (Last ditch collection) [PSYoungGen: 0K->0K(110592K)] 1572K->1572K(408576K), 0.0004040 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Last ditch collection) [PSYoungGen: 0K->0K(110592K)] [ParOldGen: 1572K->1572K(471552K)] 1572K->1572K(582144K), [Metaspace: 9138K->9138K(1058816K)], 0.0051910 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
----循环了 507 次之后异常
[GC (Metadata GC Threshold) [PSYoungGen: 2142K->192K(118784K)] 3715K->1764K(590336K), 0.0004197 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Metadata GC Threshold) org.springframework.cglib.core.CodeGenerationException: java.lang.OutOfMemoryError-->Metaspace
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:538)
    at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363)
    at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:585)
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:131)
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319)
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:572)
    at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:387)
    at com.xiaocai.jvm.oom.MetaSpaceOOMDemo.main(MetaSpaceOOMDemo.java:42)
[PSYoungGen: 192K->0K(118784K)] [ParOldGen: 1572K->1569K(653312K)] 1764K->1569K(772096K), [Metaspace: 9163K->9163K(1058816K)], 0.0220061 secs] [Times: user=0.11 sys=0.00, real=0.02 secs] 
[GC (Last ditch collection) [PSYoungGen: 0K->0K(118784K)] 1569K->1569K(772096K), 0.0006191 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (Last ditch collection) [PSYoungGen: 0K->0K(118784K)] [ParOldGen: 1569K->1569K(905728K)] 1569K->1569K(1024512K), [Metaspace: 9163K->9163K(1058816K)], 0.0062663 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
Heap
 PSYoungGen      total 118784K, used 3485K [0x00000007ab600000, 0x00000007b3800000, 0x00000007ffe00000)
  eden space 118272K, 2% used [0x00000007ab600000,0x00000007ab967530,0x00000007b2980000)
  from space 512K, 0% used [0x00000007b3780000,0x00000007b3780000,0x00000007b3800000)
  to   space 4096K, 0% used [0x00000007b3000000,0x00000007b3000000,0x00000007b3400000)
 ParOldGen       total 905728K, used 1569K [0x0000000702600000, 0x0000000739a80000, 0x00000007ab600000)
  object space 905728K, 0% used [0x0000000702600000,0x0000000702788470,0x0000000739a80000)
 Metaspace       used 9171K, capacity 10134K, committed 10240K, reserved 1058816K
  class space    used 784K, capacity 841K, committed 896K, reserved 1048576K
Caused by: java.lang.OutOfMemoryError: Metaspace
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:535)
    ... 7 more

解决办法:

(1)可以通过内存快照检查是否存在冗余类的加载,如果有存在不必要的类加载,缩减优化

(2)应用程序不能再缩减,通过-XX:MetaspaceSize=4M-XX:MaxMetaspaceSize=4m 条件元空间内存大小。

6、PermGen space

说明Java虚拟机对永久代内存设置不够。一般出现这种情况都是程序启动需要家长大量的第三方jar包。如Tomcat下部署了多个应用,或者大量动态反射生成类不断被加载,导致永久区被填满。

jdk1.7及之前的版本会有可能出现该错误。

jdk1.8及之后,就没有永久区。原来在方法区的常量最终在元空间。

四、Linux的OOM killer

我最初在自己云服务器部署springboot项目时候,会经常出现这个问题。后来去专门查了资料,可以做swap虚拟内存之后,有效的缓解了这个OOM killer的问题。不过时间长了之后还是会发送OOM killer现象。

这里就重新整理一下。

Linux 内核里的 Out of Memory (OOM) killer,OOM killer 会杀掉某个进程以腾出内存留给系统用,不致于让系统立刻崩溃。如果检查相关的日志文件(如:/var/log/messages)就会看到相关的 Out of memory: Kill process 相关信息。因为去以前的操作,实际无法截图了。

故障关键词:

Out of memory: Kill process

解决办法:

(1)配置swap虚拟内存分区

(2)修改Linux的OOM killer相关配置

OOM参考文章:

1.理解和配置 Linux 下的 OOM Killer



文章作者: Small-Rose /张小菜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose /张小菜 !
评论
  目录