jvm 基础篇-(2)- 对象分配及回收♻️(-XX:-HandlePromotionFailure、-XX:CMSInitiatingOccupancyFraction、-XX:MaxTenu...

对象分配规则

堆内存:

image.png

分配策略:

1、jvm内存宏观分配策略
内存宏观分配策略
虚拟机栈分配<<<<<传送门
2、堆内分配策略
堆内分配策略
1、对象优先分配在Eden区。

     如果Eden区没有足够的空间时,虚拟机执行一次Minor GC(Yong GC)。

2、大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。

     这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。

3、长期存活的对象进入老年代。

     虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
-XX:MaxTenuringThreshold用来定义年龄的阈值。

4、动态判断对象的年龄。

     如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。

5、空间分配担保。

     在发生Minor GC(Yong GC)之前,JVM会计算Survivor区移至老年区的对象的平均大小,虚拟机会检查老年代最大可用的连续空间是否大于需要转移的对象大小。
           如果大于,则此次Minor GC(Yong GC)是安全的。
           如果小于,jdk1.6之前:则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。
                如果大于,则尝试进行一次Minor GC(Yong GC),但这次Minor GC(Yong GC)依然是有风险的,失败后会重新发起一次Major GC(Full GC);
                如果小于或者HandlePromotionFailure=false,则改为直接进行一次Major GC(Full GC)。

但是在jdk1.6 update 24之后-XX:-HandlePromotionFailure 不起作用了,只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MonitorGC,否则FullGC
jdk1.8下,HandlePromotionFailure会报错,Unrecongnized VM option

️回收️:

什么样的对象会被回收♻️?
  • 引用计数法:


    循环引用问题
  • 可达性分析


    可达性分析
GC ROOT有哪些?
  • 虚拟机栈中本地变量表引用的对象。
  • 方法区中:
    • 类静态变量引用的对象
    • 常量引用的对象
  • 本地方法栈中JNI(java native interface)引用的对象。(JNI:Navtive 方法是 Java 通过 JNI 直接调用本地 C/C++ 库)
GC回收器清理对应堆得区域
  • Young Generation(新生代):分为:Eden区和Survivor区,Survivor区有分为大小相等的From Space和To Space。Eden区没有足够的空间时,虚拟机执行一次Minor GC
  • Old Generation(老年代): 当 OLD 区空间不够时, JVM 会在 OLD 区进行 Old GC/Major GC。
内存区域 回收算法 触发回收条件 垃圾回收器 线程
Young Generation 复制算法 Eden区没有足够的空间时 Minor GC / Young GC 单or多线程(可选择)
Old Generation 标记清除算法 Old使用达到CMS设置的阀值-XX:CMSInitiatingOccupancy
Fraction=70
Old GC/Major GC 单or多线程(可选择)
Heap Generation Young Generation采用复制算法
Old Generation采用标记整理算法
1、调用System.gc时。
2、老年代空间不足
3、方法区空间不足
4、Concurrent Mode Failure
CMS进行回收过程中有大对象
要申请进入Old区此时老年代空
间不足,就会报
Concurrent Mode Failure错误,
同时触发fullgc。
5、Minor GC后进入老年代对象
对象占用空间大小大于老年代的
可用内存。
6、执行 jmap -histo:live or
jmap -dump:live
Full GC 单线程
常见GC
  • Minor GC/Young GC:新生代GC,指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕死的特性,所以Minor GC非常频繁,一般回收速度也比较快。>>>>>复制算法 <<<<<传送门

  • Old GC/Major GC:收集整个Old gen的GC,只有CMS模式这么称呼。MajorGC的速度一般比Minor GC慢10倍以上。

  • Full GC:收集整个堆,包括Young gen、Old gen、Perm gen(如果存在的话)等所有部分的模式。灰常慢呦~

  • Mixed GC:收集整个young gen以及部分old gen的GC。只有G1模式这么称呼。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容