什么是堆区?
堆区是JVM中线程共享的区域,堆区中几乎存放了所有的对象实例。
什么是老年代什么是新生代
老年代和新生代 是基于堆区垃圾回收进行的分区
老年代占堆区的2/3,新生代占堆区1/3
分配内存的流程(强引用)
每当创建对象时,会将新对象加入新生代的Eden区,如果Eden区放不下,会触发YGC的垃圾回收机制,然后再次判断Eden区能否放下,如果可以放下则分配内存空间,如果放不下则尝试将对象放到老年代OLD区中,如果老年代放不下,则触发FGC的垃圾回收机制,然后再次判断老年代能否放下,如果可以放下则分配内存空间,否则抛出错误OOM!
特别的是
在这个过程中,当YGC执行完成时,Eden区幸存的对象(旧对象)幸存者Survivor区能否放下,如果放不下则直接移到老年代,如果能放下则会放在幸存区的from或to空间中,并且from和to空间会不断更替,而在更替过程中,GC也会判断是否有垃圾,如果有则清除,并且每更替一次,对象年龄加一,当对象年龄大于默认值15时,会将对象移到老年区。这就是一个对象在堆中分配内存的完整流程。