原创 JVM (五)堆区

发布时间:2021-08-02 06:47:16 浏览 26 来源:猿笔记 作者:小飞机yt

    -[3.运行时数据区](,-[7.对象的实例化与内存访问](,jvm堆区用来存储java运行时生成的对象:而是在堆中分配.而栈帧中保存对象的引用?只存在一个运行时数据区。1.**一个jvm实例只存在一个堆内存**,堆也是java内存管理的核心区域。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)。所有的对象实例以及数组都应当在运行时分配在堆上:所有的对象的实例都在这里分配内存(‘几乎’是因为可能存储在栈上,这个引用指向对象或者数组在堆中的位置:**堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除**,而不再使用JVM内存**,


    highlight:a11y-dark

    theme:channing-cyan

    #目录

    -[1.JVM概述](

    -2.类加载子系统](

    -3.运行时数据区](

    -4.虚拟机堆栈](

    -[5.堆区](

    -6.方法区域](

    -7.对象实例化和内存访问](

    -8.垃圾收集概述](

    -9.经典垃圾收集器](

    -[10.G1与ZGC](

    jvm堆区域用于存储java运行时生成的对象。数组和对象从不存储在堆栈上,而是在堆中分配。堆栈框架保存对象的引用,该引用指向堆中对象或数组的起始位置。

    一个jvm实例只有一个运行时数据区和一个堆内存,所有线程都共享这个内存。

    ###1.概述

    1.** JVM实例* *中只有一个堆内存,而堆也是java内存管理的核心区域

    2.Java堆区域是在JVM启动时创建的,它的空间大小是由JVM决定的。它是JVM管理的最大内存空间(可以调整堆内存的大小)

    3.3。《Java虚拟机规范》规定,堆可以在物理上不连续的内存空间中,但逻辑上应该视为连续的。

    4.所有线程共享java堆,在这里,您还可以* *划分线程私有缓冲区* *(TLAB:ThreadLocalAllocation Buffer)。(面试问题:堆空间一定要所有线程共享吗?不,TLAB线程在堆中是唯一的)

    5.java虚拟机规范中对Java堆的描述是,所有对象实例和数组都应该在运行时分配到堆上。从实用的角度来看,“几乎”所有对象实例都在这里分配内存(“几乎”是因为它们可能存储在堆栈上,另请参见* *转义分析* *)

    6。数组或对象从不存储在堆栈上,因为堆栈框架包含指向对象或数组在堆中的位置的引用。

    7.方法结束后,不会立即移除* *堆中的对象,只会在垃圾收集期间移除* *

    8.堆,是GC(GarbageCollection,垃圾收集器)**执行垃圾回收的重点区域**

    ###2.堆区域的组成

    ####2.1反应堆区域的演变

    * *从**JDK1.8开始,永久区域由元空间代替,元空间使用本地内存而不是JVM内存* *

    ####2.2堆放区的组成

    堆区的主要组成部分:伊甸园区(对象出生)、幸存者0区、幸存者1区(对象存活不超过阈值)、老年(对象存活超过阈值)、永久世代

    ####2.3新生代和老年

    1.存储在JVM中的java对象可以分为两类:一类是生命周期短的瞬态对象,创建和死亡非常快,另一类是非常长的,在某些情况下可以与JVM的生命周期保持一致

    2.Java堆区进一步细分可以分为年轻代(YoungGen)和老年代(OldGen)。其中年轻代可以分为Eden空间、Survivor0空间和Survivor1空间(有时也叫frmo区,to区)

    3.配置桩结构中新生代和老年的比例

    默认值为-xx: newratio = 2,表示新生代占1,老年占2,新生代占全堆的1/3

    可以修改-XX:NewRatio=4,表示新生代占1,老年占4,新生代占全堆的1/5

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

    5.几乎所有的Java对象都是在Eden区被new出来的

    6.新一代的Java对象绝大多数已经被销毁(IBM的专项研究显示,新一代的对象80%是“生老病死”)

    7.您可以使用选项**-Xmn来设置新一代的最大内存大小**(此参数通常使用默认值)

    ###3.对象的分配过程

    1.1.new的对象首先被放置在伊甸园中,它的大小是有限的

    2.当伊甸园的空间满了,程序就需要创建对象。jvm的垃圾收集器将对伊甸园执行垃圾收集(MinorGC),销毁伊甸园中其他对象不再引用的对象,然后将伊甸园中剩余的对象移动到幸存者0区域

    3.加载新对象并将其放入伊甸园

    4.如果再次触发垃圾收集,上次存活并存储在幸存者0区域中的对象如果不被回收,将存储在幸存者1区域中

    5.如果您再次进行垃圾收集,它将被放回幸存者区域0。然后去幸存者1区

    6当幸存者区域的存活人数达到设定人数时,将进入老年区域

    **设置次数:-XX:MaxTenuringThreshold=15**

    7.在养老区,比较悠闲。当养老区内存不足时,再次触发* * GC: MajorGC * *清理养老区内存。

    8.如果在养老区执行**MajorGC**,发现对象无法保存,会出现OOM异常。

    ###3.1图形化流程

    总结:对于幸存者S0和S1:复制后有交换,谁空谁t

作者信息

小飞机yt [等级:3]
发布了 36 篇专栏 · 获得点赞 50 · 获得阅读 2320

相关推荐 更多