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