初探JVM(2)

26 篇文章 0 订阅

初探JVM(1)

一. JVM堆内存的分代

Java对象实例以及数组都放在Java堆中,堆中对象分配和回收将是JVM的处理重点!为了更好的处理这些对象,JVM便将Java堆分成几块区域
jdk7以及更早之前:
在这里插入图片描述
jdk7之前分成了三个区域年轻代(young generation)老年代(old generation)永久代(permanent generation),其中,年轻代中又划分了Eden区、Survivor0、Survivor1区

注 意 : 方 法 区 和 永 久 代 的 区 别 和 关 系 \color{red}{注意:方法区和永久代的区别和关系}

JDK1.7以前,方法区位于永久代,我们可以说永久代是方法区的一种实现方式,也就是说我们平时称之为永久代的东西实际上就是方法区,永久代和堆相互隔离,但是是堆的逻辑组成部分,永久代的大小在启动JVM时可以设置一个固定值,不可变

在JDK1.7中,存储在永久代的部分数据就已经转移到Java 堆或者直接内存。但永久代仍存在于JDK 1.7中,并没有完全移除,譬如符号引用(Symbols)转移到了直接内存;字符串常量池(interned strings)转移到了Java 堆;类的静态变量(class statics variables )转移到了Java 堆

在JDK1.8中,仍然保留方法区的概念,只不过实现方式不同。取消永久代,方法存放于元空间(Metaspace),元空间仍然与堆不相连,但存在于直接内存中,逻辑上可认为在堆中。如图:
在这里插入图片描述

这样永久内存就不再占用堆内存。它能够通过自己主动增长来避免JDK7以及以前常见的永久内存错误(java.lang.OutOfMemoryError: PermGen),当然JDK8也提供了一个新的设置元空间(Matespace)内存大小的參数。这个參数能够设置Matespace内存大小,这样我们能够依据自己项目的实际情况,避免过度浪费本地内存,达到有效利用。
-XX:MaxMetaspaceSize=128m 设置最大的元内存空间128兆

二. 对象申请内存的过程

在这里插入图片描述

三. 一个对象在Java堆中的生活一般为下面步骤:

  1. a). 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象

  2. b). 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。

  3. c). 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次 F u l l G C \color{red}{Full GC} FullGC,也就是新生代、老年代都进行回收。


    M i n o r G C \color{red}{Minor GC} MinorGC:Minor GC会清空新生代(Eden),把Eden中的所有活的对象都移到Survivor区域中

    M a j o r G C \color{red}{Major GC} MajorGC:Major Gc 主要回收老年代区域,采用标记清除算法
            MajorGC 在发生时,一般采用两次标记。一个对象被真正判定为“死亡”,需要进行两次标记(被标记为可回收对象),然后在下一次 JVM 进行 GC 的时候,才被真正的回收掉。如果一个对象没有与 GC Roots 的引用链相连接,也并没有被真正判定为“死亡”,而是进行第一次标记,然后在第二次标记之前会进行“自救”过程。所谓的“自救”就是在第二次被标记之前,需要重新与引用链相连接。在第一次被标记后,对象会进行筛选,筛选的条件为是否有必要进行执行 finalize() 方法。如果没有必要执行 finalize() 方法,则就等待第二次被标记;如果有必要执行 finalize() 方法,则会先将对象放置在一个叫 F-Queue 的队列中,然后等待虚拟机通过Finalizer线程去触发对象的 finalize() 方法,然后在 finalize() 方法里面,对象就开始自救的过程。对象自救可以通过把this赋值给某个类变量或者对象的成员变量,就实现了和引用链重新连接的目的——自救成功。因此在第二次标记的时候就会把对象从 F-Queue 队列中移除,然后虚拟机会在 F-Queue 中进行第二次小规模的标记,然后就等待下一次 GC 的来临。
    在这里插入图片描述


    F u l l G C \color{red}{Full GC} FullGC:Full GC = Major GC + Minor GC

四. Java对象的内存布局

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值