JVM 内存分配策略

  • 概况
  • 详细说明
    • 对象优先在Eden区分配
    • 大对象直接进入老年代
    • 长期存活的对象将进入老年区

概况

所谓自动内存管理,最终要解决的就是内存分配和内存回收两个问题。内存回收即时垃圾回收机制。本文主要介绍内存分配
内存分配通常在java堆上分配(随着虚拟机优化技术的诞生,某些场景也会在栈上分配),对象主要分配在新生代的Eden区,如果开启了本地线程缓冲,将会按照线程优先在TLAB 上分配,少数情况也会在老年代上分配,总的来说分配规则不是百分之百固定的,其细节取决于哪一种垃圾回收器组合以及虚拟机相关参数有关,但是虚拟机对于内存的分配还是会遵循以下几种【普世】规则:

  • 对象优先在Eden区分配
  • 大对象直接进入老年代
  • 长期存活对象将进入老年代

详细说明

对象优先在Eden区分配

多数情况下,对象否在新生代中的Eden,当Eden区分配没有足够空间进行分配时,虚拟机将会发起一次Minor GC ,如果本次GC 还没有足够的空间,将会启用分配担保机制在老年代中分配内存。

  • Minor GC 是指发生在新生代的GC ,因为java对象大多都是朝生夕死,所以minor GC 非常频繁,一般回收速度也非常快。
  • Major GC(FULL GC), 是指发生在老年代的GC,出现Major GC 通常伴随至少一次Minor GC ,Major GC 通常会比Minor GC 慢10倍以上。

大对象直接进入老年代

所谓的大对象是指需要大量连续内存空间的对象,频繁出现大对象是致命的,会导致在内存还有不少空间的情况下提前触发GC ,以获取足够的连续空间来安置新对象。
前面我们介绍过新生代是使用的是复制算法来处理垃圾回收的,如果大对象直接在新生代分配就导致Eden区和两个Survivor 区之间发生大量的内存复制,因此对于大对象都会直接放在老年代进行分配的。
可以通过-XX:PretenureSizeThreshold = <字节大小> 设置阈值
-XX:PretenureSizeThreshold 的意思是超过这个值的时候,对象直接在old区分配内存
默认值是0,意思是不管多大都是先在eden中分配内存。

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

虚拟机采用分代收集的思想来管理内存,那么内存回收时就必须判断哪些对象应该放在新生代,哪些对象应该放在老年代,因此虚拟机给每个对象定义了一个对象年龄计数器,如果对象在Eden区出生,并且能够被Survivor容纳,将被移动到Survivor空间中,这时设置对象年龄为1,对象在Survivor区中每经过一次Minor GC 年龄就加1,当年龄到达一定程度(默认15)将会被晋升到老年代。、
默认值可以通过-XX:MaxTenuringThreshold 修改

JVM 内存分配策略相关推荐

  1. 深入理解JVM内存分配策略

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天早上8点20分, 第一时间与你相约 每日英文 Don't blame people for disappointing ...

  2. JVM内存分配策略原

    1.优先分配到eden package 深入理解java虚拟机;public class 对象优先分配到eden区 {/*** 1M的内存大小*/private static final int _1 ...

  3. Java虚拟机内存分配策略

    1.JVM内存分配分区 Java的内存简单分为堆内存和非堆内存 其中堆内存又可以分为新生代和老年代 新生代分为1个Eden区和2个Survivor区,如下图: 2.JVM垃圾回收种类 分为2种,Min ...

  4. Java之JVM的内存分配策略

    周末有小伙伴留言说上周面试时被问到内存分配策略的问题,但回答的不够理想,小伙伴说之前公号里看过这一块的文章的,当时看时很清楚,也知道各个策略是干嘛的,但面试时脑子里清楚,心里很明白,但嘴里就是说不清楚 ...

  5. 深入理解JVM(2)——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

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

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

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

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

  8. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  9. jvm(3)-垃圾收集器与内存分配策略

    [0]README 0.1)本文部分文字转自:深入理解jvm,旨在学习 垃圾收集器与内存分配策略 的基础知识: [1]垃圾回收概述 1)GC(Garbage Collection)需要完成的3件事情: ...

  10. JVM内存管理:深入垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

最新文章

  1. 使用command-privilege给H3C、华为设备的用户帐号授权
  2. 学习数据科学、机器学习与AI没有多大交集,一文告诉你三者最大区别
  3. 一文读懂 RoIPooling、RoIAlign 和 RoIWarp
  4. 你的iPhone 13,粉了吗?
  5. 西门子S7以太网通讯协议
  6. 配置文件没有关闭保护模式_别人的Issue很快就能关闭,而我的问题却迟迟没有被解决...
  7. 历史:2007年总结与2008年展望
  8. java ajax解析json数据_利用AJAX向后台servlet传JSON数据,后台利用fastjson进行解析
  9. 递归应用场景和调用机制
  10. 迁移学习训练集准确率一直上不去_可以提高你的图像识别模型准确率的7个技巧...
  11. 今年新增院士中,最年轻的是他
  12. 查找练习 hash——出现过的数字
  13. Java网络编程————UDP实现ThinkPad S5网络唤醒
  14. oralce 创建用户和权限
  15. php 闭包不能序列化,php如何序列化/存储闭包(Closure)
  16. matlab单机无限大系统_MATLAB运用simulink建立简单的单机-无穷大系统仿真
  17. BM3D图像去噪算法原理及代码详解
  18. 刺猬猫服务器维护2020,刺猬猫杂谈:我认真起来连老板的号都敢封!
  19. html5淘宝注册界面设计,电商登陆注册页设计分析
  20. FlashPro2000.C2000.TDS510.TI编程 器支持大部分TI芯片读写2812.28335等

热门文章

  1. python单位根检验看结果_python做adf检验
  2. 利用python制作动态二维码
  3. wxpython绘制雷达图_Tableau可视化分析【8】解锁雷达图
  4. 专利证书下载-不是标准的IE浏览器-解决办法
  5. java 快速判断对象是否为null的快捷方法
  6. jquery获取验证码按钮倒计时
  7. python爬虫爬取淘宝美食_python爬虫爬取淘宝商品信息
  8. MIPS体系结构简介
  9. HTML网页拓展名有哪些,网页文件的扩展名有哪些
  10. 主动降噪python_尝试使用Pyadi主动降噪时遇到错误