JVM(二)分区

2020-06-27  本文已影响0人  与乐为乐

一、分区介绍

二、堆

  1. Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。(堆内存的大小是可以调节的)
  2. 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除
  3. 堆空间,分为 4个部分
    新生代(YoungGen):伊甸园区(Eden),幸存者0区(Survivor),幸存者1区(Survivor)
    老年代(OldGen)

三、对象分配过程

  1. new的对象是分配在伊甸园区,
  2. 当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC), 此时用户线程就停止了(STW), 将伊甸园区没有任何指向性引用的对象进行销毁,回收空间。
  3. 剩下还在被占用的对象,就会复制到幸存者0区(并为每天对象分配年龄计数器。年龄+1)
  4. 此时伊甸园在次触发GC,同时会对幸存者1区的对象进行判断,还被占用的对象,从幸存者1区的对象复制到幸存者2区,年龄在+1,释放幸存者1区。被称为to区。幸存者0和幸存者1谁空了谁就是to区。 5. YGC存活的对象,会首先往to区放。同时对另一个幸存者区进行判断,没有被引用的就被回收,存活下来的年龄+1。当年龄计数达到15岁时晋升到老年代。15被称为默认情况的临界值,可以被修改。
  5. 老年代被回收的概率就小了, 当老年区内存不足时,再次触发GC:Major GC,进行养老区的内存清理。若养老区执行了Major GC之后发现依然无法进行对象的保存,就会产生OOM异常(内存溢出)。

** java.lang.OutOfMemoryError: Java heap space.**

其他情况:

幸存者区满了,伊甸园区的对象也有可能晋升到老年代。

大的对象直接被晋升到老年代。

新生代:老年代 == 1:2

伊甸园区(Eden), 幸存者0区,幸存者1区 == 8:1:1

image.png image.png

四、方法区 Method Area(元空间)

  1. 方法区可以看作是一块独立于Java堆的内存空间
  2. 方法区与Java堆一样,是各个线程共享的内存区域
  3. 方法区主要存储 类信息,常量,静态变量。
    java.lang.OutOfMemoryError: Metaspace
上一篇 下一篇

猜你喜欢

热点阅读