这个知识我觉得简单的学习办法就是看这个流程图简单易懂,首先我们先要了解一下JMM,下面是我总结的一个思维导图
一:什么是堆区?
当一个对象进来几乎都放在了堆区,堆区是Jvm中管理的最大的一块内存区域,所有线程也都共享这一块线程,也是垃圾回收最多的一块内存区域,所以也叫什么是GC堆
二:什么是新生代和老年代?
就是我这要理解了,堆区太大了,为了更好管理内存就创建出来的新生代和老年代就是说有分化出来了两块内存区域下面有一个图片帮助大家更好的理解堆区
三:一个对象进来是如何分配内存的?
1:一个新对象进来时候大部分回放到新生代的Eden区,看Eden有没有满,没满就分配一个内存来存储,满了的话就执行垃圾回收机制此时是在新生代里面的回收机(YGC)。
2:回收完之后,再一次判断是否有内存,有的话就分配内存存储,没有加入就加老年代,加之前判断老年代是否可以放下,放下就分配内存存储,放不下就执行老年代里的垃圾回收机制(FGC)
3:回收完之后,看老年代是否放的下了,放下就分配内存,如果老年代都放不下,就只能抛出OOM,堆内存溢出
4:注意带回收的过程中还发了一些回收机制,在新生代执行垃圾回收的时候不是所有的垃圾都被回收了,在这个过程中存活下来的对象就被放在了幸存者区,幸存者区又被分为from和to两块内存区域,然后当前使用的区域完全清楚,交换两块空间的使用状态,每次交换对象的年龄加一,如果YGC要移送的对象大于Survivor区容量上限,就交给老年底