码迷,mamicode.com
首页 > 其他好文 > 详细

JVM GC

时间:2019-02-14 22:06:47      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:mamicode   运行   分配   ret   年龄   cms   慢慢   内存管理   限制   

什么时候会GC

GC 一般发生在内存不够,这所说的内存不够是指连续的内存块不够运行

GC器类型

目前常用的GC回收期有 Serial/Parallel/CMS/G1,

我们目前JVM内存一般是分代回收,各个代根据功能采用了不同的GC回收器,直接使用一张非常直观的网上图片

 技术图片

GC类型

不同的代分为不同的GC类型,一般我们把年轻代叫young GC, 老年代叫old GC;

有些说法是,年轻代叫Minor GC,老年代叫Major GC;

年轻代GC

设置年轻代的目的是为了快速回收一些临时对象,遵循原则是少量多次,减轻持续运行创建对象对内存的需求压力;

年轻代的GC主要会考虑效率问题,速度要快,利用率高;

所以一般年轻代采用复制清理,采用空间换时间来提高回收效率;

老年代GC

老年代是为了存储短时间内运行上下文还需要用到的对象,或者常驻内存的对象;

老年代注重的是内存管理,性能高,不影响整个应用的运行,可持续优化(返回慢慢回收也不影响应用);

老年代一般采用标记清除或者标记整理;

年轻代对象何时刷新到老年代

年轻代对象刷新到老年代有一系列规则:

a、对象年龄的限制,这个跟TargetSurivivor设置相关,系统会根据TargetSurivivor(默认50%) 和 survivor区的大小算出一个数据,只要一次Minor GC(Eden区内存不够就会触发),系统就会统计从age为1的对象大小,超过计算出的TargetSurivor的大小就刷新到老年代;

b、当对象大小超过PretenureSizeThreshold 设置的大小,就会直接在老年代分配对象;

老年代对象与年轻代对象关联

老年代对象可能会使用(引用)年轻代的对象,所以老年代的对象和年轻代的对象可能会有关联关系;

在年轻代GC时需要查询是否在老年代中有对象的引用,为了提高效率JVM采用了Card marking (卡片标记)的方式;

卡片标记:将内存块分为大小为512b的区块,卡片中如果有对象引用了年轻代的对象,那么就标记卡片为脏卡片(dirty card),在做年轻代GC时就只需要扫描dirty card;

JVM GC

标签:mamicode   运行   分配   ret   年龄   cms   慢慢   内存管理   限制   

原文地址:https://www.cnblogs.com/souyoulang/p/10345111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!