01结合Eden区,S0,S1和old区,描述一下一个对象创建的过程。
回答:jvm在创建对象时,首先会试图在Eden区为该对象分配内存(如果该对象是大对象,占用内存空间很大,超出临界值则直接在old区为该对象分配内存,如果old区放不下则触发outofmemory异常),如果Eden区剩余空间没有足够的大的区域装载该对象则触发一次young gc,jvm会把Eden存活的对象复制到s0区(也就是from区),Eden区清空。下一次young gc (minor gc)触发时,Eden区和s0区的存活对象会被复制到s1区(也就是to区),s区中经历15次gc还存活的对象会被移到old区,old区的内存空间不够用了则触发old gc。在这个过程中如果s0或者s1区内存不够则会根据担保机制向old区借空间内存存放对象。
02怎么确定一个对象为垃圾?
不再需要被引用的对象或gc root不可达对象我们可以确定为垃圾,可以被回收。
03常用的垃圾算法有哪些?并且有哪些优缺点?
标记清除算法:优点是实现简单,缺点是需要扫描整个内存空间,耗时,且造成很多不连续的空间碎片。
标记整理:标记整理同样也是对整个空间的对象进行扫描标记,并将存活的对象按照顺序重新排列。优点是解决空间不连续碎片问题,缺点是实现起来麻烦,非常耗时
标记复制算法:优点是实现简单,耗时低,缺点是需要浪费一半的内存空间。