0%

Java内存区域与内存溢出异常

Java内存区域与内存溢出异常


概述

C\C++

  • 内存管理区域的土皇帝

Java

  • new操作不需要去写配对的delete代码

  • 不容易内存泄漏和内存溢出

    • 内存泄漏

      Memory Leak
      程序动态申请的堆内存没有释放或者无法释放,后果可能是运行变慢,也可能是程序崩溃。问题具有积累性。

    • 内存溢出

      Out of Memory
      意思是内存不够了,你要加内存条了。
      内存泄漏可能会导致内存溢出。

  • 一旦泄漏或溢出,不懂JVM没办法Debug

运行时数据区域

JVM会把她管理的内存划分为若干个区域

  • 程序计数器

    • 特点

      • 占用内存空间较少
      • 线程私有
    • 作用

      • 告诉当前线程应该执行哪一行字节码

        • 比如一个条件语句之后的跳转就可以通过设置程序计数器来实现,循环,异常处理也是如此
    • 多线程的实现

      • 线程轮流切换
      • 分配处理器执行时间
      • 每个线程要有自己独立的程序计数器
      • 执行java方法

        • 正在执行的字节码的地址
      • 执行native方法

        A native method is a Java method whose implementation is provided by non-java code.

        • null
  • java虚拟机栈

    • 特点

      • 生命周期和线程相同
      • 线程私有
    • 作用

      • 描述java方法执行的内存模型

        • 栈帧

          • 内容

            • 局部变量表

              • 基本数据类型

              • 对象引用

                • 对象引用不等同于对象本身,可能是指向对象起始地址的指针,这个指针也可能指向其他和这个对象相关的位置
              • returnAddress类型

                • 指向字节码的指针
          • 特点

            • 方法被执行时创建

            • 方法执行完成

              • 出栈
            • 方法被调用

              • 入栈
    • 笼统的内存划分

      • 栈内存

        • 这个栈内存就指的是虚拟机栈
      • 堆内存

    • 异常

      • 虚拟机栈不可以动态扩展

        • 线程请求的栈深度大于虚拟机所允许的深度会抛出StackOverFlowError
      • 虚拟机栈可以动态扩展

        • 扩展时会申请内存,申请不到内存会抛出OutOfMemory异常
  • 本地方法栈

    • 作用

      • 和Java虚拟机栈类似,只不过为Native Method服务
    • 异常

      • 和java虚拟机栈一样
    • 有的虚拟机(如HotSpot)把本地方法栈和jvm栈合二为一,不做区别

  • Java堆

    • 特点

      • jvm管理内存里最大的一块

      • 所有线程共享

      • JVM启动时创建

      • 垃圾收集器管理的主要区域

        • 因此得名GC堆(Garbage Collected heap)

          为什么不翻译成垃圾堆?哈哈哈哈哈

      • 内存空间在物理上可以不连续,逻辑上要连续

      • 主流JVM的java heap可以扩展

    • 作用

      • 存放对象实例以及数组
    • 垃圾收集器

      • 分代收集算法
    • 分类

      • 粗分

        • 新生代
        • 老生代
      • 细分

        • Eden空间
        • From Survivor空间
        • To Survivor空间
    • 异常

  • 方法区

    有个别名叫Non Heap,许多人称之为永久代

    • 特点

      • 线程共享

      • 不需要物理上连续的内存

      • 大小可扩展

      • 可以选择不进行垃圾回收

        • 回收成果难以令人满意
        • 不回收可能会导致内存泄漏
    • 作用

      • 已经被jvm加载的类信息
      • 常量
      • 静态变量
      • 即时编译器编译后的代码
    • 异常

      • OutOfMemoryError
    • 运行常量池

      方法区的一部分

      • Class文件

        • 类的版本

        • 字段

        • 方法

        • 接口

        • 常量池(Constant Pool Table)

          • 编译器生成的字面量、符号量

            字面量: literal
            我理解是这样的,比如int n = 2;这个2就是n的字面量,再比如我有个Hero类,类中有许多属性,所以我不能直接Hero tracer = “tracer”,这就没有字面量。意思就是能表示出来的就是字面量。
            符号量:Symbolic References
            我觉得这个翻译并不恰当,我还以为这个符号指的是感叹号问号那一类的符号。
            其实是这样的,在编译期间,编译器可能不知道我的某个类的具体位置,比如我的某个method里有个Undefined类(名字我瞎起的),编译器起初并不知道这个Undefined类在哪里,所以索性先用Undefined这个“符号”标记,以后再说。与之相对的是直接引用,直接应用可以是直接指向变量的指针之类的

          • 这部分内容会在类加载后存放到方法区的运行常量池里

      • 翻译出的直接引用也会存到运行常量池里

      • 动态性

        • 运行期间新的常量也可能放入运行常量池中

        • 栗子

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          public class Main {
          public static void main(String[] args) {
          String s1 = new String("intern?");
          String s2 = new String("intern?");
          System.out.println(s1 == s2); //false

          String s3 = s1.intern();
          String s4 = "intern?";
          ​ System.out.println(s3 == s4); //true
          }

          }
          • String类的intern方法

            • new出来的String会被放在java Heap里
            • 通过字面量对String初始化,她会先在运行常量池里寻找,找到则返回池里的引用,否则就在池里创建一个并返回引用。
            • new出来的String调用intern方法会把自己的引用添加到运行常量池里
      • 异常

        • OutOfMemoryError
  • 直接内存

    • 特点

      • 不属于JVM运行时数据区域

        既然不属于,为什么要归在这类呢?原因是这个内存区域访问也很多,也可能OutOfMemory,所以一起看啦。

    • 异常

      • 既然不属于JVM运行时数据区域,当然不会受到java heap大小的限制,但是会受到电脑物理内存的限制。有些服务器管理员设置参数的时候,直接把直接内存忽略掉了,结果是因为没考虑到直接内存,所以使各个区域内存总和大于物理内存的限制,动态扩展时可能OutOfMemoryError

对象访问

栗子

  • Object object = new Object();
  • new出来的Object实例放在java heap里
  • 左边这个reference放在jvm stack里
  • 实例还需要一些关于类的信息(可能是为了反射?idk),这些信息放在方法区

引用的定位方式

jvm规范只要求这个reference要指向对象,但没说怎么去定位。不同虚拟机定位方式或许不同。

  • 句柄(handle)

    • java heap中再分出一块内存作为句柄池
    • reference中存储对象的句柄地址
    • 句柄里有对象实例数据的地址和类型数据的地址
  • 直接指针

    • reference中存储对象的实例数据的地址
    • 实例数据里包含类型数据的地址

两种定位方式的优劣

  • 用句柄的话,移动对象不需要改变reference,只需要改变句柄中的实例数据地址

  • 用直接指针的话,访问对象的时候比用句柄少一次指针定位的时间,积少成多,而且访问对象是很频繁的操作。

    Sun HotSpot用的直接指针定位

OutOfMemory异常

java堆溢出

  • 栗子

    • java堆里存的是对象实例,只要一直new对象,就会产生内存溢出异常

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      public class Main {
      //-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
      public static void main(String[] args) {
      List<String> list = new LinkedList<>();
      while (true) {
      String s = new String("stack over flow");
      list.add(s);
      }
      }
      }
    • 运行结果

      D:\Software\Java\jdk-14\bin\java.exe -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 “-javaagent:D:\Software\JetBrains\IntelliJ IDEA 2019.2.2\lib\idea_rt.jar=49458:D:\Software\JetBrains\IntelliJ IDEA 2019.2.2\bin” -Dfile.encoding=UTF-8 -classpath D:\Software\Java\javafx-sdk-11.0.2\lib;D:\Software\Java\javafx-sdk-11.0.2\bin;D:\Project\IdeaProjects\JVM\out\production\JVM eternal.fire.Main
      [0.017s][warning][gc] -XX:+PrintGCDetails is deprecated. Will use -Xlog:gc* instead.
      [0.027s][info ][gc,heap] Heap region size: 1M
      [0.027s][info ][gc,heap,coops] Heap address: 0x00000000fec00000, size: 20 MB, Compressed Oops mode: 32-bit
      [0.029s][info ][gc      ] Using G1
      [0.052s][info ][gc      ] Periodic GC disabled
      [0.142s][info ][gc,start   ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
      [0.142s][info ][gc,task   ] GC(0) Using 2 workers of 4 for evacuation
      [0.162s][info ][gc,phases  ] GC(0)  Pre Evacuate Collection Set: 0.0ms
      [0.162s][info ][gc,phases  ] GC(0)  Merge Heap Roots: 0.0ms
      [0.162s][info ][gc,phases  ] GC(0)  Evacuate Collection Set: 19.2ms
      [0.162s][info ][gc,phases  ] GC(0)  Post Evacuate Collection Set: 0.2ms
      [0.162s][info ][gc,phases  ] GC(0)  Other: 0.2ms
      [0.162s][info ][gc,heap   ] GC(0) Eden regions: 10->0(8)
      [0.162s][info ][gc,heap   ] GC(0) Survivor regions: 0->2(2)
      [0.162s][info ][gc,heap   ] GC(0) Old regions: 0->7
      [0.162s][info ][gc,heap   ] GC(0) Archive regions: 0->0
      [0.162s][info ][gc,heap   ] GC(0) Humongous regions: 0->0
      [0.162s][info ][gc,metaspace ] GC(0) Metaspace: 828K(4864K)->828K(4864K) NonClass: 752K(4352K)->752K(4352K) Class: 76K(512K)->76K(512K)
      [0.162s][info ][gc      ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 10M->8M(20M) 19.717ms
      [0.162s][info ][gc,cpu    ] GC(0) User=0.03s Sys=0.00s Real=0.02s
      [0.164s][info ][gc,start   ] GC(1) Pause Young (Normal) (G1 Evacuation Pause)
      [0.164s][info ][gc,task   ] GC(1) Using 2 workers of 4 for evacuation
      [0.195s][info ][gc      ] GC(1) To-space exhausted
      [0.195s][info ][gc,phases  ] GC(1)  Pre Evacuate Collection Set: 0.0ms
      [0.195s][info ][gc,phases  ] GC(1)  Merge Heap Roots: 0.1ms
      [0.195s][info ][gc,phases  ] GC(1)  Evacuate Collection Set: 24.8ms
      [0.195s][info ][gc,phases  ] GC(1)  Post Evacuate Collection Set: 6.1ms
      [0.195s][info ][gc,phases  ] GC(1)  Other: 0.1ms
      [0.195s][info ][gc,heap   ] GC(1) Eden regions: 8->0(9)
      [0.195s][info ][gc,heap   ] GC(1) Survivor regions: 2->1(2)
      [0.195s][info ][gc,heap   ] GC(1) Old regions: 7->18
      [0.195s][info ][gc,heap   ] GC(1) Archive regions: 0->0
      [0.195s][info ][gc,heap   ] GC(1) Humongous regions: 0->0
      [0.195s][info ][gc,metaspace ] GC(1) Metaspace: 860K(4864K)->860K(4864K) NonClass: 776K(4352K)->776K(4352K) Class: 83K(512K)->83K(512K)
      [0.195s][info ][gc      ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 16M->19M(20M) 31.208ms
      [0.195s][info ][gc,cpu    ] GC(1) User=0.05s Sys=0.02s Real=0.03s
      [0.196s][info ][gc,start   ] GC(2) Pause Young (Concurrent Start) (G1 Evacuation Pause)
      [0.196s][info ][gc,task   ] GC(2) Using 2 workers of 4 for evacuation
      [0.206s][info ][gc      ] GC(2) To-space exhausted
      [0.206s][info ][gc,phases  ] GC(2)  Pre Evacuate Collection Set: 0.0ms
      [0.206s][info ][gc,phases  ] GC(2)  Merge Heap Roots: 0.1ms
      [0.206s][info ][gc,phases  ] GC(2)  Evacuate Collection Set: 7.6ms
      [0.206s][info ][gc,phases  ] GC(2)  Post Evacuate Collection Set: 2.5ms
      [0.206s][info ][gc,phases  ] GC(2)  Other: 0.1ms
      [0.206s][info ][gc,heap   ] GC(2) Eden regions: 1->0(10)
      [0.206s][info ][gc,heap   ] GC(2) Survivor regions: 1->0(0)
      [0.206s][info ][gc,heap   ] GC(2) Old regions: 18->20
      [0.206s][info ][gc,heap   ] GC(2) Archive regions: 0->0
      [0.206s][info ][gc,heap   ] GC(2) Humongous regions: 0->0
      [0.206s][info ][gc,metaspace ] GC(2) Metaspace: 863K(4864K)->863K(4864K) NonClass: 779K(4352K)->779K(4352K) Class: 84K(512K)->84K(512K)
      [0.206s][info ][gc      ] GC(2) Pause Young (Concurrent Start) (G1 Evacuation Pause) 20M->20M(20M) 10.425ms
      [0.206s][info ][gc,cpu    ] GC(2) User=0.03s Sys=0.00s Real=0.01s
      [0.206s][info ][gc      ] GC(3) Concurrent Cycle
      [0.206s][info ][gc,task   ] GC(4) Using 2 workers of 4 for full compaction
      [0.206s][info ][gc,marking  ] GC(3) Concurrent Clear Claimed Marks
      [0.206s][info ][gc,marking  ] GC(3) Concurrent Clear Claimed Marks 0.010ms
      [0.206s][info ][gc,marking  ] GC(3) Concurrent Scan Root Regions
      [0.206s][info ][gc,marking  ] GC(3) Concurrent Scan Root Regions 0.005ms
      [0.206s][info ][gc,marking  ] GC(3) Concurrent Mark (0.206s)
      [0.206s][info ][gc,marking  ] GC(3) Concurrent Mark From Roots
      [0.206s][info ][gc,task   ] GC(3) Using 1 workers of 1 for marking
      [0.206s][info ][gc,start   ] GC(4) Pause Full (G1 Evacuation Pause)
      [0.207s][info ][gc,phases,start] GC(4) Phase 1: Mark live objects
      [0.222s][info ][gc,phases   ] GC(4) Phase 1: Mark live objects 15.531ms
      [0.222s][info ][gc,phases,start] GC(4) Phase 2: Prepare for compaction
      [0.225s][info ][gc,phases   ] GC(4) Phase 2: Prepare for compaction 3.259ms
      [0.226s][info ][gc,phases,start] GC(4) Phase 3: Adjust pointers
      [0.230s][info ][gc,phases   ] GC(4) Phase 3: Adjust pointers 4.823ms
      [0.230s][info ][gc,phases,start] GC(4) Phase 4: Compact heap
      [0.234s][info ][gc,phases   ] GC(4) Phase 4: Compact heap 3.391ms
      [0.234s][info ][gc,heap    ] GC(4) Eden regions: 0->0(10)
      [0.234s][info ][gc,heap    ] GC(4) Survivor regions: 0->0(0)
      [0.234s][info ][gc,heap    ] GC(4) Old regions: 20->19
      [0.234s][info ][gc,heap    ] GC(4) Archive regions: 0->0
      [0.234s][info ][gc,heap    ] GC(4) Humongous regions: 0->0
      [0.234s][info ][gc,metaspace  ] GC(4) Metaspace: 863K(4864K)->863K(4864K) NonClass: 779K(4352K)->779K(4352K) Class: 84K(512K)->84K(512K)
      [0.234s][info ][gc       ] GC(4) Pause Full (G1 Evacuation Pause) 20M->17M(20M) 27.490ms
      [0.234s][info ][gc,cpu     ] GC(4) User=0.06s Sys=0.00s Real=0.03s
      [0.234s][info ][gc,marking   ] GC(3) Concurrent Mark From Roots 27.911ms
      [0.234s][info ][gc,marking   ] GC(3) Concurrent Mark Abort
      [0.234s][info ][gc       ] GC(3) Concurrent Cycle 27.980ms
      [0.235s][info ][gc,start    ] GC(5) Pause Young (Normal) (G1 Evacuation Pause)
      [0.235s][info ][gc,task    ] GC(5) Using 2 workers of 4 for evacuation
      [0.239s][info ][gc       ] GC(5) To-space exhausted
      [0.239s][info ][gc,phases   ] GC(5)  Pre Evacuate Collection Set: 0.0ms
      [0.239s][info ][gc,phases   ] GC(5)  Merge Heap Roots: 0.0ms
      [0.239s][info ][gc,phases   ] GC(5)  Evacuate Collection Set: 2.7ms
      [0.239s][info ][gc,phases   ] GC(5)  Post Evacuate Collection Set: 1.5ms
      [0.239s][info ][gc,phases   ] GC(5)  Other: 0.1ms
      [0.239s][info ][gc,heap    ] GC(5) Eden regions: 1->0(10)
      [0.239s][info ][gc,heap    ] GC(5) Survivor regions: 0->0(0)
      [0.239s][info ][gc,heap    ] GC(5) Old regions: 19->20
      [0.239s][info ][gc,heap    ] GC(5) Archive regions: 0->0
      [0.239s][info ][gc,heap    ] GC(5) Humongous regions: 0->0
      [0.239s][info ][gc,metaspace  ] GC(5) Metaspace: 877K(4864K)->877K(4864K) NonClass: 791K(4352K)->791K(4352K) Class: 85K(512K)->85K(512K)
      [0.239s][info ][gc       ] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 18M->18M(20M) 4.331ms
      [0.239s][info ][gc,cpu     ] GC(5) User=0.00s Sys=0.00s Real=0.00s
      [0.239s][info ][gc,task    ] GC(6) Using 2 workers of 4 for full compaction
      [0.239s][info ][gc,start    ] GC(6) Pause Full (G1 Evacuation Pause)
      [0.239s][info ][gc,phases,start] GC(6) Phase 1: Mark live objects
      [0.260s][info ][gc,phases   ] GC(6) Phase 1: Mark live objects 20.870ms
      [0.260s][info ][gc,phases,start] GC(6) Phase 2: Prepare for compaction
      [0.265s][info ][gc,phases   ] GC(6) Phase 2: Prepare for compaction 4.449ms
      [0.265s][info ][gc,phases,start] GC(6) Phase 3: Adjust pointers
      [0.270s][info ][gc,phases   ] GC(6) Phase 3: Adjust pointers 4.844ms
      [0.270s][info ][gc,phases,start] GC(6) Phase 4: Compact heap
      [0.273s][info ][gc,phases   ] GC(6) Phase 4: Compact heap 2.932ms
      [0.273s][info ][gc,heap    ] GC(6) Eden regions: 0->0(10)
      [0.273s][info ][gc,heap    ] GC(6) Survivor regions: 0->0(0)
      [0.273s][info ][gc,heap    ] GC(6) Old regions: 20->19
      [0.273s][info ][gc,heap    ] GC(6) Archive regions: 0->0
      [0.273s][info ][gc,heap    ] GC(6) Humongous regions: 0->0
      [0.273s][info ][gc,metaspace  ] GC(6) Metaspace: 877K(4864K)->877K(4864K) NonClass: 791K(4352K)->791K(4352K) Class: 85K(512K)->85K(512K)
      [0.273s][info ][gc       ] GC(6) Pause Full (G1 Evacuation Pause) 18M->18M(20M) 33.448ms
      [0.273s][info ][gc,cpu     ] GC(6) User=0.03s Sys=0.00s Real=0.03s
      [0.274s][info ][gc,start    ] GC(7) Pause Young (Concurrent Start) (G1 Evacuation Pause)
      [0.274s][info ][gc,task    ] GC(7) Using 2 workers of 4 for evacuation
      [0.279s][info ][gc       ] GC(7) To-space exhausted
      [0.279s][info ][gc,phases   ] GC(7)  Pre Evacuate Collection Set: 0.0ms
      [0.279s][info ][gc,phases   ] GC(7)  Merge Heap Roots: 0.0ms
      [0.279s][info ][gc,phases   ] GC(7)  Evacuate Collection Set: 2.6ms
      [0.279s][info ][gc,phases   ] GC(7)  Post Evacuate Collection Set: 2.0ms
      [0.279s][info ][gc,phases   ] GC(7)  Other: 0.1ms
      [0.279s][info ][gc,heap    ] GC(7) Eden regions: 1->0(10)
      [0.279s][info ][gc,heap    ] GC(7) Survivor regions: 0->0(0)
      [0.279s][info ][gc,heap    ] GC(7) Old regions: 19->20
      [0.279s][info ][gc,heap    ] GC(7) Archive regions: 0->0
      [0.279s][info ][gc,heap    ] GC(7) Humongous regions: 0->0
      [0.279s][info ][gc,metaspace  ] GC(7) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.279s][info ][gc       ] GC(7) Pause Young (Concurrent Start) (G1 Evacuation Pause) 19M->19M(20M) 4.810ms
      [0.279s][info ][gc,cpu     ] GC(7) User=0.02s Sys=0.00s Real=0.01s
      [0.279s][info ][gc,task    ] GC(8) Using 2 workers of 4 for full compaction
      [0.279s][info ][gc,start    ] GC(8) Pause Full (G1 Evacuation Pause)
      [0.279s][info ][gc       ] GC(9) Concurrent Cycle
      [0.279s][info ][gc,marking   ] GC(9) Concurrent Clear Claimed Marks
      [0.279s][info ][gc,marking   ] GC(9) Concurrent Clear Claimed Marks 0.007ms
      [0.279s][info ][gc,marking   ] GC(9) Concurrent Scan Root Regions
      [0.279s][info ][gc,marking   ] GC(9) Concurrent Scan Root Regions 0.004ms
      [0.279s][info ][gc,marking   ] GC(9) Concurrent Mark (0.279s)
      [0.279s][info ][gc,phases,start] GC(8) Phase 1: Mark live objects
      [0.297s][info ][gc,phases   ] GC(8) Phase 1: Mark live objects 17.333ms
      [0.297s][info ][gc,phases,start] GC(8) Phase 2: Prepare for compaction
      [0.300s][info ][gc,phases   ] GC(8) Phase 2: Prepare for compaction 3.819ms
      [0.300s][info ][gc,phases,start] GC(8) Phase 3: Adjust pointers
      [0.306s][info ][gc,phases   ] GC(8) Phase 3: Adjust pointers 5.189ms
      [0.306s][info ][gc,phases,start] GC(8) Phase 4: Compact heap
      [0.309s][info ][gc,phases   ] GC(8) Phase 4: Compact heap 3.243ms
      [0.309s][info ][gc,heap    ] GC(8) Eden regions: 0->0(10)
      [0.309s][info ][gc,heap    ] GC(8) Survivor regions: 0->0(0)
      [0.309s][info ][gc,heap    ] GC(8) Old regions: 20->20
      [0.309s][info ][gc,heap    ] GC(8) Archive regions: 0->0
      [0.309s][info ][gc,heap    ] GC(8) Humongous regions: 0->0
      [0.309s][info ][gc,metaspace  ] GC(8) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.309s][info ][gc       ] GC(8) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 29.953ms
      [0.309s][info ][gc,cpu     ] GC(8) User=0.02s Sys=0.00s Real=0.03s
      [0.309s][info ][gc,task    ] GC(10) Using 2 workers of 4 for full compaction
      [0.310s][info ][gc,start    ] GC(10) Pause Full (G1 Evacuation Pause)
      [0.310s][info ][gc,phases,start] GC(10) Phase 1: Mark live objects
      [0.327s][info ][gc,phases   ] GC(10) Phase 1: Mark live objects 17.019ms
      [0.327s][info ][gc,phases,start] GC(10) Phase 2: Prepare for compaction
      [0.331s][info ][gc,phases   ] GC(10) Phase 2: Prepare for compaction 3.941ms
      [0.331s][info ][gc,phases,start] GC(10) Phase 3: Adjust pointers
      [0.335s][info ][gc,phases   ] GC(10) Phase 3: Adjust pointers 4.810ms
      [0.335s][info ][gc,phases,start] GC(10) Phase 4: Compact heap
      [0.338s][info ][gc,phases   ] GC(10) Phase 4: Compact heap 2.592ms
      [0.338s][info ][gc,heap    ] GC(10) Eden regions: 0->0(10)
      [0.338s][info ][gc,heap    ] GC(10) Survivor regions: 0->0(0)
      [0.338s][info ][gc,heap    ] GC(10) Old regions: 20->20
      [0.338s][info ][gc,heap    ] GC(10) Archive regions: 0->0
      [0.338s][info ][gc,heap    ] GC(10) Humongous regions: 0->0
      [0.338s][info ][gc,metaspace  ] GC(10) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.338s][info ][gc       ] GC(10) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 28.726ms
      [0.339s][info ][gc,cpu     ] GC(10) User=0.06s Sys=0.00s Real=0.03s
      [0.339s][info ][gc,marking   ] GC(9) Concurrent Mark Abort
      [0.339s][info ][gc       ] GC(9) Concurrent Cycle 59.644ms
      [0.339s][info ][gc,start    ] GC(11) Pause Young (Normal) (G1 Evacuation Pause)
      [0.339s][info ][gc,task    ] GC(11) Using 2 workers of 4 for evacuation
      [0.339s][info ][gc,phases   ] GC(11)  Pre Evacuate Collection Set: 0.0ms
      [0.339s][info ][gc,phases   ] GC(11)  Merge Heap Roots: 0.0ms
      [0.339s][info ][gc,phases   ] GC(11)  Evacuate Collection Set: 0.0ms
      [0.339s][info ][gc,phases   ] GC(11)  Post Evacuate Collection Set: 0.1ms
      [0.339s][info ][gc,phases   ] GC(11)  Other: 0.1ms
      [0.339s][info ][gc,heap    ] GC(11) Eden regions: 0->0(10)
      [0.339s][info ][gc,heap    ] GC(11) Survivor regions: 0->0(0)
      [0.339s][info ][gc,heap    ] GC(11) Old regions: 20->20
      [0.339s][info ][gc,heap    ] GC(11) Archive regions: 0->0
      [0.339s][info ][gc,heap    ] GC(11) Humongous regions: 0->0
      [0.339s][info ][gc,metaspace  ] GC(11) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.339s][info ][gc       ] GC(11) Pause Young (Normal) (G1 Evacuation Pause) 19M->19M(20M) 0.268ms
      [0.339s][info ][gc,cpu     ] GC(11) User=0.00s Sys=0.00s Real=0.00s
      [0.339s][info ][gc,task    ] GC(12) Using 2 workers of 4 for full compaction
      [0.339s][info ][gc,start    ] GC(12) Pause Full (G1 Evacuation Pause)
      [0.339s][info ][gc,phases,start] GC(12) Phase 1: Mark live objects
      [0.356s][info ][gc,phases   ] GC(12) Phase 1: Mark live objects 16.720ms
      [0.356s][info ][gc,phases,start] GC(12) Phase 2: Prepare for compaction
      [0.367s][info ][gc,phases   ] GC(12) Phase 2: Prepare for compaction 10.800ms
      [0.367s][info ][gc,phases,start] GC(12) Phase 3: Adjust pointers
      [0.372s][info ][gc,phases   ] GC(12) Phase 3: Adjust pointers 5.027ms
      [0.372s][info ][gc,phases,start] GC(12) Phase 4: Compact heap
      [0.376s][info ][gc,phases   ] GC(12) Phase 4: Compact heap 4.215ms
      [0.376s][info ][gc,heap    ] GC(12) Eden regions: 0->0(10)
      [0.376s][info ][gc,heap    ] GC(12) Survivor regions: 0->0(0)
      [0.376s][info ][gc,heap    ] GC(12) Old regions: 20->20
      [0.376s][info ][gc,heap    ] GC(12) Archive regions: 0->0
      [0.376s][info ][gc,heap    ] GC(12) Humongous regions: 0->0
      [0.376s][info ][gc,metaspace  ] GC(12) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.376s][info ][gc       ] GC(12) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 37.163ms
      [0.377s][info ][gc,cpu     ] GC(12) User=0.09s Sys=0.00s Real=0.04s
      [0.377s][info ][gc,task    ] GC(13) Using 2 workers of 4 for full compaction
      [0.377s][info ][gc,start    ] GC(13) Pause Full (G1 Evacuation Pause)
      [0.377s][info ][gc,phases,start] GC(13) Phase 1: Mark live objects
      [0.394s][info ][gc,phases   ] GC(13) Phase 1: Mark live objects 16.754ms
      [0.394s][info ][gc,phases,start] GC(13) Phase 2: Prepare for compaction
      [0.397s][info ][gc,phases   ] GC(13) Phase 2: Prepare for compaction 3.615ms
      [0.397s][info ][gc,phases,start] GC(13) Phase 3: Adjust pointers
      [0.402s][info ][gc,phases   ] GC(13) Phase 3: Adjust pointers 4.787ms
      [0.402s][info ][gc,phases,start] GC(13) Phase 4: Compact heap
      [0.405s][info ][gc,phases   ] GC(13) Phase 4: Compact heap 2.556ms
      [0.405s][info ][gc,heap    ] GC(13) Eden regions: 0->0(10)
      [0.405s][info ][gc,heap    ] GC(13) Survivor regions: 0->0(0)
      [0.405s][info ][gc,heap    ] GC(13) Old regions: 20->20
      [0.405s][info ][gc,heap    ] GC(13) Archive regions: 0->0
      [0.405s][info ][gc,heap    ] GC(13) Humongous regions: 0->0
      [0.405s][info ][gc,metaspace  ] GC(13) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.405s][info ][gc       ] GC(13) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 28.025ms
      [0.405s][info ][gc,cpu     ] GC(13) User=0.06s Sys=0.00s Real=0.03s
      [0.405s][info ][gc,start    ] GC(14) Pause Young (Concurrent Start) (G1 Evacuation Pause)
      [0.406s][info ][gc,task    ] GC(14) Using 2 workers of 4 for evacuation
      [0.406s][info ][gc,phases   ] GC(14)  Pre Evacuate Collection Set: 0.0ms
      [0.406s][info ][gc,phases   ] GC(14)  Merge Heap Roots: 0.0ms
      [0.406s][info ][gc,phases   ] GC(14)  Evacuate Collection Set: 0.1ms
      [0.406s][info ][gc,phases   ] GC(14)  Post Evacuate Collection Set: 0.1ms
      [0.406s][info ][gc,phases   ] GC(14)  Other: 0.1ms
      [0.406s][info ][gc,heap    ] GC(14) Eden regions: 0->0(10)
      [0.406s][info ][gc,heap    ] GC(14) Survivor regions: 0->0(0)
      [0.406s][info ][gc,heap    ] GC(14) Old regions: 20->20
      [0.406s][info ][gc,heap    ] GC(14) Archive regions: 0->0
      [0.406s][info ][gc,heap    ] GC(14) Humongous regions: 0->0
      [0.406s][info ][gc,metaspace  ] GC(14) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.406s][info ][gc       ] GC(14) Pause Young (Concurrent Start) (G1 Evacuation Pause) 19M->19M(20M) 0.332ms
      [0.406s][info ][gc,cpu     ] GC(14) User=0.00s Sys=0.00s Real=0.00s
      [0.406s][info ][gc,task    ] GC(15) Using 2 workers of 4 for full compaction
      [0.406s][info ][gc       ] GC(16) Concurrent Cycle
      [0.406s][info ][gc,marking   ] GC(16) Concurrent Clear Claimed Marks
      [0.406s][info ][gc,marking   ] GC(16) Concurrent Clear Claimed Marks 0.006ms
      [0.406s][info ][gc,marking   ] GC(16) Concurrent Scan Root Regions
      [0.406s][info ][gc,marking   ] GC(16) Concurrent Scan Root Regions 0.005ms
      [0.406s][info ][gc,marking   ] GC(16) Concurrent Mark (0.406s)
      [0.406s][info ][gc,marking   ] GC(16) Concurrent Mark From Roots
      [0.406s][info ][gc,task    ] GC(16) Using 1 workers of 1 for marking
      [0.406s][info ][gc,start    ] GC(15) Pause Full (G1 Evacuation Pause)
      [0.406s][info ][gc,phases,start] GC(15) Phase 1: Mark live objects
      [0.423s][info ][gc,phases   ] GC(15) Phase 1: Mark live objects 16.596ms
      [0.423s][info ][gc,phases,start] GC(15) Phase 2: Prepare for compaction
      [0.427s][info ][gc,phases   ] GC(15) Phase 2: Prepare for compaction 4.129ms
      [0.427s][info ][gc,phases,start] GC(15) Phase 3: Adjust pointers
      [0.432s][info ][gc,phases   ] GC(15) Phase 3: Adjust pointers 5.072ms
      [0.432s][info ][gc,phases,start] GC(15) Phase 4: Compact heap
      [0.436s][info ][gc,phases   ] GC(15) Phase 4: Compact heap 3.706ms
      [0.436s][info ][gc,heap    ] GC(15) Eden regions: 0->0(10)
      [0.436s][info ][gc,heap    ] GC(15) Survivor regions: 0->0(0)
      [0.436s][info ][gc,heap    ] GC(15) Old regions: 20->20
      [0.436s][info ][gc,heap    ] GC(15) Archive regions: 0->0
      [0.436s][info ][gc,heap    ] GC(15) Humongous regions: 0->0
      [0.436s][info ][gc,metaspace  ] GC(15) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.436s][info ][gc       ] GC(15) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 29.957ms
      [0.437s][info ][gc,cpu     ] GC(15) User=0.05s Sys=0.00s Real=0.03s
      [0.437s][info ][gc,task    ] GC(17) Using 2 workers of 4 for full compaction
      [0.437s][info ][gc,start    ] GC(17) Pause Full (G1 Evacuation Pause)
      [0.437s][info ][gc,phases,start] GC(17) Phase 1: Mark live objects
      [0.456s][info ][gc,phases   ] GC(17) Phase 1: Mark live objects 19.597ms
      [0.456s][info ][gc,phases,start] GC(17) Phase 2: Prepare for compaction
      [0.462s][info ][gc,phases   ] GC(17) Phase 2: Prepare for compaction 5.797ms
      [0.462s][info ][gc,phases,start] GC(17) Phase 3: Adjust pointers
      [0.467s][info ][gc,phases   ] GC(17) Phase 3: Adjust pointers 4.970ms
      [0.467s][info ][gc,phases,start] GC(17) Phase 4: Compact heap
      [0.470s][info ][gc,phases   ] GC(17) Phase 4: Compact heap 3.354ms
      [0.471s][info ][gc,heap    ] GC(17) Eden regions: 0->0(10)
      [0.471s][info ][gc,heap    ] GC(17) Survivor regions: 0->0(0)
      [0.471s][info ][gc,heap    ] GC(17) Old regions: 20->20
      [0.471s][info ][gc,heap    ] GC(17) Archive regions: 0->0
      [0.471s][info ][gc,heap    ] GC(17) Humongous regions: 0->0
      [0.471s][info ][gc,metaspace  ] GC(17) Metaspace: 898K(4864K)->898K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.471s][info ][gc       ] GC(17) Pause Full (G1 Evacuation Pause) 19M->19M(20M) 34.180ms
      [0.471s][info ][gc,cpu     ] GC(17) User=0.06s Sys=0.00s Real=0.03s
      [0.471s][info ][gc,marking   ] GC(16) Concurrent Mark From Roots 65.292ms
      [0.471s][info ][gc,marking   ] GC(16) Concurrent Mark Abort
      [0.471s][info ][gc       ] GC(16) Concurrent Cycle 65.353ms
      [0.471s][info ][gc,start    ] GC(18) Pause Young (Normal) (G1 Evacuation Pause)
      [0.471s][info ][gc,task    ] GC(18) Using 2 workers of 4 for evacuation
      [0.471s][info ][gc,phases   ] GC(18)  Pre Evacuate Collection Set: 0.0ms
      [0.471s][info ][gc,phases   ] GC(18)  Merge Heap Roots: 0.0ms
      [0.471s][info ][gc,phases   ] GC(18)  Evacuate Collection Set: 0.0ms
      [0.471s][info ][gc,phases   ] GC(18)  Post Evacuate Collection Set: 0.1ms
      [0.471s][info ][gc,phases   ] GC(18)  Other: 0.1ms
      [0.471s][info ][gc,heap    ] GC(18) Eden regions: 0->0(10)
      [0.472s][info ][gc,heap    ] GC(18) Survivor regions: 0->0(0)
      [0.472s][info ][gc,heap    ] GC(18) Old regions: 20->20
      [0.472s][info ][gc,heap    ] GC(18) Archive regions: 0->0
      [0.472s][info ][gc,heap    ] GC(18) Humongous regions: 0->0
      [0.472s][info ][gc,metaspace  ] GC(18) Metaspace: 899K(4864K)->899K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.472s][info ][gc       ] GC(18) Pause Young (Normal) (G1 Evacuation Pause) 19M->19M(20M) 0.265ms
      [0.472s][info ][gc,cpu     ] GC(18) User=0.00s Sys=0.00s Real=0.00s
      [0.472s][info ][gc,task    ] GC(19) Using 2 workers of 4 for full compaction
      [0.472s][info ][gc,start    ] GC(19) Pause Full (G1 Evacuation Pause)
      [0.472s][info ][gc,phases,start] GC(19) Phase 1: Mark live objects
      [0.472s][info ][gc,phases   ] GC(19) Phase 1: Mark live objects 0.749ms
      [0.472s][info ][gc,phases,start] GC(19) Phase 2: Prepare for compaction
      [0.473s][info ][gc,phases   ] GC(19) Phase 2: Prepare for compaction 0.233ms
      [0.473s][info ][gc,phases,start] GC(19) Phase 3: Adjust pointers
      [0.473s][info ][gc,phases   ] GC(19) Phase 3: Adjust pointers 0.566ms
      [0.473s][info ][gc,phases,start] GC(19) Phase 4: Compact heap
      [0.473s][info ][gc,phases   ] GC(19) Phase 4: Compact heap 0.244ms
      [0.474s][info ][gc,heap    ] GC(19) Eden regions: 0->0(10)
      [0.474s][info ][gc,heap    ] GC(19) Survivor regions: 0->0(0)
      [0.474s][info ][gc,heap    ] GC(19) Old regions: 20->2
      [0.474s][info ][gc,heap    ] GC(19) Archive regions: 0->0
      [0.474s][info ][gc,heap    ] GC(19) Humongous regions: 0->0
      [0.474s][info ][gc,metaspace  ] GC(19) Metaspace: 899K(4864K)->899K(4864K) NonClass: 811K(4352K)->811K(4352K) Class: 87K(512K)->87K(512K)
      [0.474s][info ][gc       ] GC(19) Pause Full (G1 Evacuation Pause) 19M->0M(20M) 2.030ms
      [0.474s][info ][gc,cpu     ] GC(19) User=0.00s Sys=0.00s Real=0.00s
      [0.475s][info ][gc,heap,exit  ] Heap
      [0.475s][info ][gc,heap,exit  ] garbage-first heap  total 20480K, used 938K [0x00000000fec00000, 0x0000000100000000)
      [0.475s][info ][gc,heap,exit  ]  region size 1024K, 1 young (1024K), 0 survivors (0K)
      [0.475s][info ][gc,heap,exit  ] Metaspace    used 935K, capacity 4537K, committed 4864K, reserved 1056768K
      [0.475s][info ][gc,heap,exit  ]  class space  used 92K, capacity 404K, committed 512K, reserved 1048576K
      Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
      at eternal.fire.Main.main(Main.java:10)
      Process finished with exit code 1

  • 关键提示

    • java.lang.OutOfMemoryError: Java heap space
  • Debug

    • 先看内存中的对象是否有必要存在

      • 有必要存在就不是内存泄漏

        • 调参:看看物理内存能不能加
        • 看看对象的生命周期是不是太长
      • 没必要存在就是内存泄漏

        • 是不是垃圾收集器出了问题

虚拟机栈和本地方法栈溢出

  • StackOverFlowError

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package eternal.fire;

    public class JVMStackOverFlow {
    private int stackLength;

    public void stackLeak() {
    stackLength++;
    stackLeak();;
    }

    public static void main(String[] args) {
    JVMStackOverFlow jvmStackOverFlow = new JVMStackOverFlow();
    try {
    jvmStackOverFlow.stackLeak();
    } catch (StackOverflowError e) {
    System.out.println("stack length:" + jvmStackOverFlow.stackLength);
    throw e;
    }
    }

    }

    输出:
    stack length:19056
    Exception in thread "main" java.lang.StackOverflowError

    • 单线程内存不够分只会触发Stack OverflowError
  • OutOfMemoryError

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package eternal.fire;

    public class JVMOutOfMemory {
    private void dontStop() {
    while (true) {

    ​ }
    }

    public void stackLeakByThread() {
    while (true) {
    Thread thread = new Thread(this::dontStop);
    thread.start();
    }
    }

    public static void main(String[] args) {
    JVMOutOfMemory jvmOutOfMemory = new JVMOutOfMemory();
    jvmOutOfMemory.stackLeakByThread();
    }

    }
    • 多线程可能触发OutOfMemoryError

      比如windows 32位,每个进程的最大内存是2GB,除去java堆、方法区之类的空间,剩下的由虚拟机栈和本地方法栈瓜分,给每个线程分的栈越大,能建立线程的数量就越小,建立线程需要耗费内存,所以更容易OutOfMemoryError

    • 可以说是创建线程导致的

      一般人肯定想不到,我分给她的内存越多,她反倒越容易OutOfMemory。OutOfMemory之后可以先考虑减少线程数,如果线程数不能减少,那就换64位机器,如果换不了,那就减少Java堆和方法区的内存。啥?内存不够我还要减少java堆的内存?这一般人肯定想不到啊。

    • 说明

      按理说我的这个测试应该会OutOfMemory的,但是跑了半天却跑不出个bug来,只是我的电脑变得很卡,变得很卡是有道理的,但为啥跑不出bug呀,我猜可能是idea或者是java8以后对这个有所优化,ByTheWay,我的输入法突然崩了,但能打字,不只是搜狗输入法,我的日语输入法也出了毛病,kind of weird. 刚切到桌面,我的桌面图标的名字也变成马赛克了???神奇。我的整个系统都出了毛病。希望重启能解决问题

运行时常量池溢出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package eternal.fire;

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

public class RuntimeConstantPoolOutOfMemory {
//-XX:PermSize=10M
public static void main(String[] args) {
List<String> list = new ArrayList<>();
int i = 0;
while (true) {
list.add(String.valueOf(i++).intern());
}
}
}
  • 无限intern就是很好的方法

  • 为了防止GC回收,可以用一个List去持续持有这些String的引用

  • 运行结果

    理论结果应该是:OutOfMemoryError:PermGen space,意思是方法区空间不够了,从中也可以看出运行时常量池是方法区的一部分

    • 我不敢继续运行了,我害怕对我的机器造成一些损害。
    • 按理说方法区应该大小有限制的啊,怎么内存一直暴涨啊

方法区溢出

  • 方法区存放类的信息

    • 类名
    • 访问修饰符
    • 常量池
    • 字段描述
    • 方法描述
  • 造bug方法:产生大量的类,但是比较麻烦,所以就不做了。

直接内存 溢出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package eternal.fire;

import sun.misc.Unsafe;

import java.lang.reflect.Field;


public class DirectMemoryOOM {
private static final int _1MB = 1024 * 1024;
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
// -Xmx20M -XX:MaxDirectMemorySize=10M
Field unsafeField = Unsafe.class.getDeclaredField()[0];
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
while (true) {
unsafe.allocateMemory(_1MB);
}
}
}
  • 说明

    • 这代码可能太老了,我编译都通过不了