一、对象创建
java中一个对象T,如果属性只有基本类型,称为标量(类似于c中的结构体),可以用几个基本类型代替该对象。
方法有自己的私有内存,与方法栈(栈帧)
①一个方法中,for()…中用new Object,如果没有其他方法引用该对象,则可以将创建的对象,放在栈中,而不是放在堆中。
②对于有引用的,需要放在堆中当这个对象很大时,直接放到老年代去
③对象不大,很小时,往堆中的伊甸区放(jvm为了避免大量对象同时去竞争伊甸区,在线程本地有个TAB,thread local acollote buffer)先分配到线程本地,然后再到伊甸区。
④GC清除阶段,幸存下来的就进入S1,年龄够了就进入老年代,年龄不够幸存下来就进入S2,循环往复。
二、垃圾回收器
除了GC1、ZGC,还有6种垃圾回收器,一般是两两成对出现的。
jdk1.8,如果没有专门配置过,默认用的就是Parallel与Parallel Old。一个一个的来看:
Serial与Serial Old
在jdk1.0、jdk1.1、jdk1.2等很老的时期,服务器内存都很小,只有一个GC线程工作,所以会有较长时间的stop the world 时间,工作线程与GC线程交替执行。
Serial Old就是与Serial 成对出现的,Serial工作在年轻代,Serial Old工作在老年代,使用复制算法
Parallel Scavenge与Parallel Old
这两哥们,与Serial的区别就是GC线程变成了多个。
ParNew与CMS
ParNew全称叫Parallel New,工作在年轻代,与Parallel Scavenge类似,其诞生是为了与CMS进行配对。
CMS工作在老年代,是一个很经典的,承上启下的一款回收器,虽然有很多bug)
初始标记与重新标记是stw的,并发标记与并发清理与工作线程同时工作。
初始标记:stw一般200ms左右,但是长的也有卡几个小时,甚至2天的现象,
并发标记:这时候有两个问题:首先是标记不全,工作线程又产生了垃圾(称为浮动垃圾),但这时候问题不大,因为可以等下次再回收。其次是错标,之前标记成垃圾了,但是后面又被引用了(不如缓存读取产生),就产生了错标。以及漏标
重新标记:为了解决并发标记的错标问题。
并发清理:回收
CMS的出现:因为第二种PP回收器GC线程不断增大,会带来一个问题,操作系统的Context Switch(上下文切换)开销不断增加,故GC线程不能一直增加,就诞生CMS。
G1、ZGC
G1是建立分区。G1与ZGC利用的是三色标记