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

发布于:2022-07-26 ⋅ 阅读:(366) ⋅ 点赞:(0)

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

开发和生产环境中建议将初始堆内存和最大堆内存设置成相同的值。为什么呢??
如果不设置为一样的话,那么在生产的环境中可能会不断的扩容,不断的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、堆空间参数大小设置

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到