1 概括

1.1 自动内存管理

  给对象分配内存+回收分配给对象的内存。前者涉及内存分配策略;后者涉及gc算法(标记-清除、复制、标记-整理、分代收集)以及gc器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1)

1.2 内存分配大致方向

  堆上分配(JIT编译后拆散为标量类型并间接地栈上分配)、对象主要分配在新生代的Eden区上(若启动了本地线程分配缓冲,将按线程优先在TLAB上分配)、少数情况直接分配在老年代。

1.3 内存分配策略

  对象优先在Eden分配;大对象直接进入老年代;长期存活的对象将进入老年代;动态对象年龄判定;空间分配担保。

2 对象优先在Eden分配

2.1 Eden分配

  大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间进行分配时,VM将发起一次Minor GC。
  新生代总可用空间:Eden区 + 1个Survivor区的总容量。

2.2 新生代和老年代GC

新生代GC(Minor GC)和老年代GC(Major GC/ Full GC)

  • 新生代GC:Minor GC指发生在新生代的垃圾收集动作,Java对象大多是朝生夕灭,Minor GC非常频繁,回收速度快。
  • 老年代GC:Major GC指发生在老年代的GC,出现此GC,经常会伴随至少一次Minor GC,一般Major GC比Minor GC慢10倍以上。

3 大对象直接进入老年代

3.1大对象

  需要大量连续内存空间的Java对象。如长字符串以及数组。

3.2 大对象问题

  经常出现大对象会导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来存储大对象。

3.3 参数

-XX:PretenureSizeThreshold参数,(只对Serial和ParNew有效)可以使得大于该值的对象直接在老年代分配,目的是避免在Eden区及两个Survivor区之间发生大量的内存复制(新生代采用复制算法进行GC)。

4 长期存活的对象将进入老年代

VM给每个对象定义一个对象年龄计数器:

  • 若对象在Eden出生并经过第一次Minor GC后仍然存活,且能被Survivor容纳,将被移动到Survivor空间中,并且对象年龄设为1;
  • 对象在Survivor中每“熬过”一次Minor GC,年龄就增加1岁;
  • 当年龄增加到一定程度(默认为15岁),将会晋升到老年代中;(老年代进入的阈值可以通过-XX:MaxTenuringThreshold设置)

5 动态对象年龄判定

  若在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无需等到MaxTenuringThreshold的阈值。

6 空间分配担保

(针对老年代是否有能力担保的)

  • 在发生Minor GC前,VM会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,若成立,则Minor GC可以确保安全;
  • 若不成立,则VM查看HandlePromotionFailure设置值是否允许担保失败,若允许,则继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,若大于,则尝试进行一次Minor GC,若小于,或参数设置为不允许担保失败则改为Full GC。
  • JDK6 Update24之后的规则为:只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就进行Minor GC,否则进行Full GC。

JVM—内存分配与回收策略相关推荐

  1. 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...

  2. 深入理解Java虚拟机(第三弹)- JVM 内存分配与回收策略原理,从此告别 JVM 内存分配文盲

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...

  3. JVM:内存分配与回收策略?Full GC 的触发条件?StopTheWorld ?

    内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快. Full GC: ...

  4. JVM之内存分配与回收策略

    JVM之内存分配与回收策略 来源 https://www.cnblogs.com/xiaoxi/p/6557473.html JVM分代垃圾回收策略的基础概念 来源 https://www.cnblo ...

  5. JVM 之 内存分配与回收策略

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-[https://blog.csdn.net/cjm2484836553/article/details/103842357] <J ...

  6. 实战:内存分配与回收策略

    实战:内存分配与回收策略 ​ Java技术体系的自动内存管理,最核心的目标就是自动化的解决两个问题:内存分配和内存回收,在之前我们讲的都是内存回收,现在我们来看一下内存分配的细节,这里我是使用JDK1 ...

  7. JVM3:实战:内存分配与回收策略

    实战:内存分配与回收策略 文章目录 实战:内存分配与回收策略 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 对象优先在Eden分配 试分配三 ...

  8. Java 虚拟机内存分配与回收策略

    垃圾收集器与内存分配策略参考目录: 1.判断 Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9 中的 GC 调优 5.内存分配与回收策略 一.对象优先在 E ...

  9. jvm深入理解:内存分配与回收策略(优先在Eden分配、大对象直接进入老年代、长期存活的对象将进入老年代、动态对象年龄判定、空间分配担保)

    出入:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存. 象的内存分配,从 ...

最新文章

  1. 初学者怎么学单片机,嵌入式单片机培训机构有用吗?
  2. springcloud 相同服务名_Spring 微服务从入门到入土
  3. BLE蓝牙hid键盘表
  4. mvc html.antiforgerytoken,MVC Html.AntiForgeryToken() 防止CSRF***
  5. python-基本装饰器
  6. 什么?你竟然还没有用这几个chrome插件? 1
  7. Vue首屏性能优化组件
  8. golang 数组 最后一个_Golang 内存管理
  9. [设计模式-行为型]迭代器模式(Iterator)
  10. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程...
  11. ADS1115 应用指导
  12. Linux开机密码重置
  13. php 百度地图根据经纬度获取地址,百度地图 根据经纬度获取地址
  14. chromium aura简介
  15. 原生JS快速实现拖放(drag and drop)效果
  16. iOS微信发布8.0.29版本,苹果14用户快来
  17. 计算机xp上网运行很慢,如何解决WinXP打开我的电脑很慢的问题?
  18. Maven依赖jar包的查询
  19. ffmpeg_Cropping video(剪裁视频)命令行
  20. UVA11400(dp)

热门文章

  1. python __getitem__()方法==>可以直接通过P[key]做运算
  2. numpy.ceil() 和 numpy.floor()--向上取整和向下取整
  3. eclipse无法打开.ftl文件或打开.ftl没提示
  4. html是纯文本语言吗,记事本是纯文本文件吗
  5. 抛物线的中点生成算法_零基础学习梯度下降算法
  6. phpcmsV9导航栏目点击跳转始终是localhost首页 bug - 分析篇
  7. java断言assertequals_如何实现Java测试的自定义断言
  8. poi为什么所有celltype都是string_不是所有向日葵都向阳,你知道为什么吗
  9. python 箭头_Python命名箭头方向
  10. Hexo-theme-Fluid Material Design 风格的 Hexo 主题