释放双眼,带上耳机,听听看~!
HotSpot在内存管理上对JVM内存采用了分代管理机制:
HotSpot将堆内存分为了三个区域:
1)Perm:永久代(1.7版本及之前被称为永久代对应的是Method Area方法区)
2)New/Young:新生代(新生代由Eden伊甸园区和存活区组成)
3)Old:旧生代
在tomcat管理界面可查看到JVM分代管理的信息
以下基于jdk1.8
新生代(New/Young):
新生代用于存放新创建的对象,新生代又被分为三个区段,分别是Eden伊甸园区、S0区、S1区(S0和S1区原名为 Survivor Space存活区),又被称为From/To区,To总为空。
一般在Eden分配对象,优化:Thread Local Allocation Buffer;
保存80%-90%生命周期较短得对象,新生代区域GC频率高,所以采用效率较高的 复制算法Copying
GC类型:Minor GC 被称为小GC,针对新生代的垃圾回收。新生代区可能会一直进行创建对象、复制对象、GC掉不可用对象,保留可用对象,交换S0到S1的名称,直到新生代区内存区域满了之后,就会将活下来的对象移动到Old区,然后进行Minor GC操作。
在HostPsot内存管理中,不同对象的生命周期不同,98%的对象都是临时对象(临时对象只会在新生代中进行复制,在被放到旧生代之前就被抛弃,只有极少数的对象能被放到旧生代中)。
旧生代(Old):
存放新生代中经历多次GC仍然存活的对象
新建的对象也有可能直接在年老代中分配,取决于具体GC的实现。可以配置参数当对象大于多少内存空间则直接放入旧生代等。
GC频率相对较低,因为对象要成功熬过在新生代过程中的好几轮的GC才能进入旧生代区,旧生代采用 标记-清理-压缩(mark-sweep-compaction)算法,使算法的结合和优化。
GC类型:Major GC 被称为大GC,针对旧生代的垃圾回收。当新生代将对象陆续放入旧生代区域中,旧生代内存空间满了以后,则会进行Major GC,来一次清理以释放内存空间。
永久代(Permanent Generation):
永久代存放Java本身的一些数据,当类不在使用时,也会被回收。
永久代在JDK1.7版本中对应的是JVM运行时内存环境中的Method Area方法区。
在JDK1.8中取消了永久代,用于代替永久代的有Code Cache代码缓存区、Compressed Class Space压缩类空间、Metaspace元空间。
GC类型:Full GC :完全的垃圾回收, 针对永久代(Code Cache代码缓存区、Compressed Class Space压缩类空间、Metaspace元空间)、新生代、旧生代三者的垃圾回收、
如果永久代内存区域也满了以后则会进行一次Full GC,此次GC会暂停JVM的所有线程,来专注清理内存空间,务必对代码来说是一次打击。会造成程序进入一个假死的状态,因为所有的JVM线程全部被终止,不会再处理任何请求。被称为 STP状态。
当永久代和旧生代触发GC时,多数垃圾回收器都会触发Full GC。
* 首先按照新生代配置的GC方式进行 Minor GC 小GC。
* 再按照旧生代配置的GC方式对 旧生代代和永久代进行GC
* 如果JVM估计 Minor GC 后可能会发生晋升失败,则直接采用旧生代配置的GC方式对 Young、Old、Perm进行大GC或者Full GC。
本章完 下章讲解HotSpot垃圾回收器