准备
讲一下JVM(虚拟机)的内存模型
https://blog.csdn.net/javazejian/article/details/72772461
Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入何时对另一个线程可见。 从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中, 每个线程都有一个私有的本地内存(local memory) 本地内存中存储了该线程以读/写共享变量的副本。
讲一讲新生代的内存划分以及新生代和老年代的垃圾回收
新生代就是用来放新生对象的区域 占大概是1/3;
老年代就是用来放应用程序中存活时间比较长的对象2/3;
新生代又分为 eden survivor from 和survivor to;
发生在新生代中的minorGC
- Eden中创建新对象,如果空间不够 那么就用到了minorGC ,即清除掉无用对象,同时讲存活的对象移到from或者to的空间里,这时对象可以在 eden和from空间里
- 如果 eden和from空间里都用不到的话,用分配担保机制将对象移到老年代
发生在老年代的major GC也叫 fullGC
MajorGC采用标记清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC 会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。当老年代也满了装不下的时候,就会抛出OOM (Out of Memory)异常。