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

本文详细介绍了Java堆内存的结构与管理,包括年轻代和老年代的划分,对象的分配过程,以及如何通过-Xms和-Xmx设置堆大小。强调了堆内存对GC的重要性,并讨论了OOM异常, MinorGC、MajorGC、FullGC的触发机制。同时,提到了堆空间参数调整的策略及其对系统性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、堆空间参数大小设置

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值