内存分配策略

了解GC其中很重要一点就是了解JVM的内存分配策略:即对象在哪里分配和对象什么时候回收

Java技术体系中所提倡的自动内存管理可以归结于两个部分:给对象分配内存以及回收分配给对象的内存。 
我们都知道,Java对象分配,都是在Java堆上进行分配的,虽然存在JIT编译后被拆分为标量类型并简介地在栈上进行分配。如果采用分代算法,那么新生的对象是分配在新生代的Eden区上的。如果启动了本地线程分配缓冲,将按线程优先在TLAB上进行分配。 
事实上,Java的分配规则不是百分百固定的,其取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。

简单来说,对象内存分配主要是在堆中分配。但是分配的规则并不是固定的,取决于使用的收集器组合以及JVM内存相关参数的设定。
下面Serial和Serial Old收集器做一个内存分配和回收的策略总结。

1.对象优先在新生代Eden分配

首先,让我们来看一下新生代的内存分配情况: 
内存分配情况: 
将JVM内存划分为一块较大的Eden空间(80%)和两块小的Servivor(各占10%)。当回收时,将Eden和Survivor中还存活的对象一次性采用复制算法直接复制到另外一块Servivor空间上,最后清理到院Eden空间和原先的Survivor空间中的数据。 
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,JVM将发起一次Minor GC。 
在这里先说明两个概念:

·         新生代GCMinor GC):指发生在新生代的垃圾收集动作,因为Java对象大多是具有朝生夕灭的特性,所以Minor GC非常频繁,而且该速度也比较快。

·         老年代GCMajor GC/Full GC):指发生在老年代的GC,出现了Major GC,一般可能也会伴随着一次Minor GC,但是与Minor GC不同的是,Major GC的速度慢十倍以上。

2.大对象直接进入老年代

我们先对所谓的大对象做一个定义:大对象,这里指的是需要大量连续内存空间的Java对象。最典型的大对象可以是很长的字符串和数组。 
JVM对大对象的态度: 
大对象对于JVM的内存分配来说是十分麻烦的,如果我们将大对象分配在新生代中,那样子的话很容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来“安置”它们。、 
为了避免上述情况的经常发生而导致不需要的GC活动所浪费的资源和时间,可采用的分配策略是将大对象直接分配到老年代中去,虚拟机中也提供了-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代里面分配内容。

-XX:PretenureSizeThreshold只对Serial和ParNew收集器有效。

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

当JVM采用分代收集的思想来管理内存时,为了识别哪些对象应该放在新生代、哪些对象应该放在老年代,JVM给每个对象定义了一个对象年龄计数器。 
对象年龄计数器:如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,便可以被移动到Survivor空间中,年龄计数器将设置该对象的年龄为1.对于对象在Survivor区每经过一次Minor GC,年龄便增加1岁,当它的年龄增加到一定程度(可通过参数-XX:MaxTenuringThreshold设置)默认15,该对象便会进入到老年代中。成为老年代的对象。

4.动态对象年龄判定

事实上,有的虚拟机并不永远地要求对象的年龄必须达到MaxTeruringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Surivior空间的一半,年龄大于或等于该年龄的对象就可以直接进行老年代,无须等到MaxTeruringThreshold中所要求的年龄。

5.空间分配担保

在发生Minor GC之前,虚拟机会先检查老年代中最大的可用的连续空间是否大于新生代中所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的,如果不成立,则虚拟机会查看HandlePromotionFaiure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次GC是有风险的;如果小于,或者HandlePromotionFaiure设置不允许冒险,那么这时就要改为进行一次Full GC。 
所谓冒险:也就是说当用来轮转的Survivor区无法承受新生代中所存活的对象内存时,需要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代中,前提是老年代中。

JVM快速调优手册v1.0之三:内存分配策略相关推荐

  1. JVM快速调优手册v1.0

    1.JVM内存结构(堆内存和非堆内存) 2.常见的垃圾收集器 3.内存分配策略 4.堆内存分配的CMS公式解析 5.ParNew收集器+CMS收集器组合的产品案例分析(响应时间优化) 6.垃圾收集器常 ...

  2. JVM性能调优3_垃圾收集器与内存分配策略__享学课堂

    Stop The World现象 GC收集器和我们GC调优的目标就是尽可能的减少STW的时间和次数. 内存分配与回收策略 对象优先在Eden分配,如果说Eden内存空间不足,就会发生Minor GC ...

  3. JVM性能调优2_垃圾收集器与内存分配策略__享学课堂

    判断对象的存活 引用计数法: 优点:快,方便,实现简单: 缺点:对象相互引用时,很难判断对象是否该回收. 可达性分析: 这个算法的基本思路就是通过一系列的称为"GC Roots"的 ...

  4. JVM快速调优手册02:常见的垃圾收集器

    2019独角兽企业重金招聘Python工程师标准>>> 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. Java虚拟机规范中对垃圾收集器应该如何实现并没有任 ...

  5. JVM由浅入深系列——详解垃圾收集器与内存分配策略

    文章目录 一.内存分配策略 1.引用计数算法 2.可达性分析算法 3.标记清除算法 4.标记复制算法 5.标记整理算法 二.收集器 1.Serial收集器 2.ParNew收集器 3.Parallel ...

  6. 深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

    3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象 ...

  7. jvm性能调优实战 -52修复堆内存区域内存溢出问题OutOfMemoryError: Java heap space

    文章目录 Pre Code 运行 用MAT分析内存快照 小结 Pre 上一篇文章已经给大家分析了栈内存溢出是如何来解决的,这篇文章我们给大家分析一下最常见的堆内存溢出是如何来解决的. Code 采用的 ...

  8. jvm性能调优实战 -51修复栈内存区域内存溢出问题 StackOverFlow

    文章目录 Pre 栈内存溢出能依托之前的办法解决吗? Code 运行代码后分析异常报错信息的调用栈 小结 Pre 之前的文章,我们分析了Metaspace区域是如何内存溢出的,同时还带着大家分析了一下 ...

  9. oracle 内存分配,Oracle调优修改10g,11g内存分配

    先查看数据库是否使用spfile启动,如果不是的话,只需要在pfile中修改,然后重启数据库即可 SQL> show parameter spfile; NAME TYPE VALUE ---- ...

最新文章

  1. mysql教程多表查询_mysql重点,表查询操作和多表查询
  2. 前沿科技 | 中科院科学家研究揭示奥陶纪末生命大灭绝新机制
  3. SQL学习之组合查询(UNION)
  4. PHP运算符与表达式
  5. AGG第三十五课 gsv_text 渲染ASCII字符
  6. 华为手机所有图标变黑_华为官博科普手机状态栏小图标含义,总共分为4大类...
  7. 构建地理上分散的网络之4点论证
  8. 浮动div,回到顶部
  9. ddr4 lpddr4区别_i3 10100F和i5 9400F哪个好?区别有多大?两者性能对比评测_硬件评测...
  10. thinkphp-page
  11. container and Injection
  12. 设计模式原则之四:迪米特法则
  13. Zabbix 对接 LDAP 实现用户统一登录的方法
  14. less(css)语言快速入门
  15. 基于51单片机的智能温控风扇(程序+仿真+原理图)
  16. 虚拟局域网与Trunk
  17. TIBCO中间件 介绍与部署
  18. Android运行报错:Error: Static interface methods are only supported starting with Android N
  19. Nginx:配置 proxy_pass 代理转发
  20. 开关电源matlab仿真文件,《MATLAB+在开关电源仿真中的应用.pdf》-支持高清全文免费浏览-max文档...

热门文章

  1. collins词典第八版mdx_英语词典选择
  2. android 截屏 分享,Android应用内截图分享的实现记录
  3. 已在页面完全加载前强制排版_公众号写作排版指南v2.0(适配Dark Mode)
  4. phpcms 指定id范围 调用_Dubbogo 源码笔记(二)客户端调用过程
  5. 图灵机器人调用数据恢复_python:用itchat打造属于自己的微信聊天机器人,24小时运行...
  6. 前后端分离提交多次验证
  7. python解读器_Python装饰器完全解读
  8. 栈空间不够会报错吗_c++如何解决大数组栈内存不够的问题
  9. 台灯的内置和外置是什么意思_外置污水提升装置有哪些优势
  10. e生保等待期什么意思_买了保险不知道赔什么?一文看懂【保险责任】