GC垃圾回收

永久代不在堆内存里

Java堆内存(heap):
    --是 JVM 用于分配 Java 对象的内存,包含活动对象和不可用对象 
    --堆大小通常是在服务器启动时使用 java 命令中的 –Xms(最小) –Xmx(最大)标志来定义。
Permanent区:
    --指内存的永久保存区域
    --是Sun JDK和HP JDK用来加载类(class)和Meta信息的专门的内存区
 
 
 
整块堆区域分为Young Generation、Tenured Generation
Young区又分为:Eden、Survivor Space
 
 
 
垃圾回收(GC)的产生过程
     1)新生成的对象在Eden区完成内存分配
     2)当Eden区满了,再创建对象,会因为申请不到空间,触发minorGC,进行young(eden+1survivor)区的垃圾回收。(为什么是eden+1survivor:两个survivor中始终有一个survivor是空的,空的那个被标记成To Survivor)
     3)minorGC时,Eden不能被回收的对象被放入到空的survivor(也就是放到To Survivor,同时Eden肯定会被清空),另一个survivor(From Survivor)里不能被GC回收的对象也会被放入这个survivor(To Survivor),始终保证一个survivor是空的。(MinorGC完成之后,To Survivor 和 From Survivor的标记互换)
     4)当做第3步的时候,如果发现存放对象的那个survivor满了,则这些对象被copy到old区,或者survivor区没有满,但是有些对象已经足够Old(通过XX:MaxTenuringThreshold参数来设置),也被放入Old区
     5)当Old区被放满的之后,进行完整的垃圾回收,即 Full GC
     6)Full GC时,整理的是Old Generation里的对象,把存活的对象放入到Permanent Generation里。
 
 
 
 
 
原文地址:https://www.cnblogs.com/lnas01/p/5354116.html