美文网首页
JVM(二)分区

JVM(二)分区

作者: 与乐为乐 | 来源:发表于2020-06-27 18:24 被阅读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.**

  • 扩展

    • 老年代被GC,是新生代所花费的时间是10倍左右。

    • 据统计分析80%左右的Java对象都是在新生代的过程中就被销毁掉了

    (IBM公司的专门研究表明,新生代80%的对象都是“朝生夕死”的)

    • 幸存者区满了的时候不会触发GC.只有伊甸园区满了的时候会和幸存者区一起被回收,

其他情况:

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

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

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

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

image.png image.png
  • 在hotSpot中,Eden空间和另外两个Survivor空间缺省所占的比例是8:1:1(测试的时候是6:1:1),开发人员可以通过选项 -XX:SurvivorRatio 调整空间比例,如-XX:SurvivorRatio=8

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

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

相关文章

  • JVM(二)分区

    一、分区介绍 每个线程:独立包括程序计数器、栈、本地栈 线程间共享:堆、堆外内存(方法区、永久代或元空间、代码缓存...

  • jvm分区

    耐心是一切聪明才智的基础。 jvm分区 除了程序计数器都会抛出oom异常,栈和本地方法区还会抛出overstack...

  • JVM基础知识

    四、JVM JVM内存分区[图片上传失败...(image-a420b3-1642485776065)]https...

  • JVM基础知识点

    1. 内存模型以及分区,需要详细到每个区放什么(共分为5个)。 JVM内存模型及分区jvm内存模型和内存分配 程序...

  • JVM系列(五):Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演。 什么是 Java GC Java GC(Garbag...

  • jvm系列:Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演。 什么是 Java GC Java GC(Garbag...

  • jvm系列(五):Java GC 分析

    ​Java GC就是JVM记录仪,书画了JVM各个分区的表演。 什么是 Java GC Java GC(Garba...

  • 架构筑基面试题系列:JVM+并发编程+Netty

    JVM 1. 内存模型以及分区,需要详细到每个区放什么? 2.堆里面的分区:Eden,survival (from...

  • 【本人秃顶程序员】关于JVM内存的N个问题

    ←←←←←←←←←←←← 快!点关注 JVM的内存区域是怎么划分的? JVM的内存划分中,有部分区域是线程私有的,...

  • 详解jvm内存分区

    java内存模型 程序计数器在JVM规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执...

网友评论

      本文标题:JVM(二)分区

      本文链接:https://www.haomeiwen.com/subject/yfyvfktx.html