推导JVM内存模型存在的必要性:
1. JVM内存模型:
2. JVM内存模型推导设计过程:
2.1.结构一:
每经历一次yong GC或者minor GC存活下来的对象age+=1。当age=15时进入老年区。
提高扫描效率:
产生矛盾:经历一次yong GC或者minor GC后内存会造成不连续,也就是我们说的内存碎片多,所以当创建一个非常大的新的对象时就会找不到连续的内存空间装下(触发yong GC或者minor GC)。
2.2.结构二:
解决矛盾:
划分为eden区和s区。
分析:在每一次经历yong GC或者minor GC后存活的对象都会进入s区,并且在s区是排好顺序的,这样eden区就有足够的连续的空间留给新的大的对象了。
产生矛盾:每经历一次yong GC或者minor GC后s区的对象也会被回收,这时在s区也会产生碎片,从eden区进来的对象可能太大而找不到连续的空间装下。
2.3.结构三:
解决矛盾:
将s区分为s0区和s1区。
分析:每经历一次yong GC或者minor GC后在s0/s1区的对象就会复制进入s1/s0区,同时在进入s1/s0区后是排序的,因此经历yong GC或者minor GC后从eden区存活的对象就会有足够的连续的空间装下了。
3.担保机制:
原因:新生代不够用。
4.新想法:为什么新生代的eden区:s0:s1=8:1:1,而不是4:3:3(让eden区占比少一点)?
原因:eden区占比少,创建新对象因内存不太够而导致装不下,就会触发young GC回收对象,这样就会浪费我们的对象,同时,频繁的GC会占用操作系统线程资源,因为要遍历我们的young区。