数据共享有堆栈、寄存器和PC,线程共享有堆、全局变量、静态变量和方法区域。
代码、简单变量和结构将放在堆栈中,而对象和装箱数据将放在堆栈中。 回收了堆内存。
年轻一代的话,最先制作的对象都被安置在eden区,但是把年轻一代分成三个部分,主要是为了让生命周期短的对象尽量留在年轻一代。 如果eden区无法申请空间,则进行minorGC,并将生存对象复制到survior。 上一代主要存储生命周期较长的对象,如缓存对象。 具体的jvm内存回收过程说明如下。
1、对象在Eden区完成内存分配;
2、伊甸园区满后,创建对象,由于不能申请空间,触发minorGC进行young (伊甸园1服务)区垃圾回收
3、对于minorGC,Eden不能回收的对象放入空的survivor (Eden一定是空的),另一个survivor不能回收到GC的对象也放入该survivor,总是一个survivor为空
4、在步骤3的时候,如果发现survivor已经满了,就复制这些对象去old区。 或者,虽然survivor未满,但某些对象已经足够old,可以放入old区XX:MaxTenuringThreshold中;
5、Old区满后进行全GC;
Java进行gc时,Java除gc以外的其他进程由于需要gc而暂停进行,发生停止-热世界,此时只剩下gc线程的执行。
因此,在优化gc时主要减少停止世界的发生。