• JVM -运行时数据区 - 堆空间


    1、堆的核心概念

    1、一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。
    2、Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间,【堆内存大小是可以调节的
    3、堆可以处于物理上不连续的,但在逻辑上它应该被视为连续的。
    4、所有的对象实例化及数组都应当在运行时分配在堆上。
    5、数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置。
    6、在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。
    7、堆,是垃圾收集器(GC)执行垃圾回收重点收集的区域。

    2、堆内存细分

    在这里插入图片描述

    3、设置堆内存大小与OOM

    1、设置堆空间大小的参数

    • -Xms:用来设置堆空间(年轻代+老年代)的初始内存大小
    • -Xmx:用来设置堆空间(年轻代+老年代)的最大内存大小

    2 、默认堆空间大小

    • 初始内存大小:物理电脑内存大小/64
    • 最大内存大小:物理电脑内存大小/4

    3、在Idea中设置堆空间大小

    1、手动设置 :

    -Xms600m -Xmx600m
    
    • 1

    开发和生产环境中建议将初始堆内存和最大堆内存设置成相同的值。为什么呢??
    如果不设置为一样的话,那么在生产的环境中可能会不断的扩容,不断的GC垃圾回收,就会造成系统的压力。设置为一样,可以避免频繁的GC操作。

    2、查看设置的参数:

    • 方式一:-XX:+PrintGCDetails

    4、OOM说明和举例

    在这里插入图片描述

    在这里插入图片描述
    当老年代空间已满就会出现OOM异常

    4、年轻代和老年代

    1、存储在JVM中的Java对象可以被划分为两类:

    • 一类是生命周期较短的瞬时对象,这类对象的创建和消亡都是非常迅速的
    • 另外一类对象的生命周期却非常长,在某些极端的情况下还能够与JVM的生命周期保持一致。
      2、Java堆区进一步细分的话,可以划分为年轻代(YoungGen)和老年代(OldGen)
      3、其中年轻代又可以划分为Eden空间、S0空间和S1空间(有时候也叫做from区、to区)
      在这里插入图片描述
      4、年轻代与老年代的占比情况:
      在这里插入图片描述
      5、新生代内存分配情况:
      在这里插入图片描述

    5、对象分配过程

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    总结:
    1、针对幸存者S0和S1区的总结:复制之后有交换,谁空谁是to
    2、关于垃圾回收:频繁在新生代收集,很少在养老区收集。几乎不在永久代/元空间收集。

    在这里插入图片描述

    6、Minor GC、Major GC、Full GC

    在这里插入图片描述

    6.1、年轻代GC触发机制

    在这里插入图片描述

    6.2 老年代GC(Major GC/Full GC)触发机制

    在这里插入图片描述

    6.3 Full GC触发机制

    在这里插入图片描述

    堆空间分代思想

    在这里插入图片描述
    在这里插入图片描述

    7、内存分配策略(或对象提升规则)

    在这里插入图片描述

    8、堆空间参数大小设置

    在这里插入图片描述

  • 相关阅读:
    LeetCode Cookbook 数组习题(1)
    外卖App点菜页-两个tableView联动【1】
    【Python入门基础2】关于print()函数 及 格式化输出
    VM——坐标转换
    Uniapp有奖猜歌游戏系统源码,附带流量主
    技术干货|昇思MindSpore NLP模型迁移之LUKE模型——阅读理解任务
    mysql 每日自动备份数据库
    为什么大家考完软考中级都去考高级?原因在这里!
    高新企业认定条件
    前端开发ui设计稿在网页上的实现
  • 原文地址:https://blog.csdn.net/java123456111/article/details/125979403