调整JVM参数如下:

-XX:NewSize=10485760—新生代大小为10m
-XX:MaxNewSize=10485760—新生代最大大小为10m
-Xms20M—初始堆大小为20m
-Xmx20M—最大堆大小为20m
-XX:+UseParNewGC:新生代使用ParNewGC垃圾回收器
-XX:+UseConcMarkSweepGC---老年代使用CMS
-XX:+PrintGCDetails---打印GC详细日志
-XX:+PrintGCTimeStamps—打印GC时间
-XX:SurvivorRatio=8—设置eden区和survivor区的比例为8:1:1
-XX:PretenureSizeThreshold=10485760—设置最大对象的阈值为10m

测试demo:

/*** Survivor区放不下存活对象,部分对象进入老年代*/
public class demo {public static void main(String[] args) {byte[] bytes1 = new byte[1024 * 1024];//1mbytes1 = new byte[1024 * 1024];//1mbytes1 = new byte[1024 * 1024];//1m//直接分配一个5m的对象,由于eden区只有8m,之前已经分配了3m再加上一些未知对象也会占据一定的内存空间,此时必然会引起新生代gcbyte[] bytes3 = new byte[5 * 1024 * 1024];//5m}
}

GC信息:
以上信息关键关注红框部分,GC过后,此时from区大概被占据85%的内存,老年代中则大致有1026k的空间被占用。

修改下代码,再多分配一个128kb的对象,修改后demo1如下:

/*** Survivor区放不下存活对象,部分对象进入老年代*/
public class demo1 {public static void main(String[] args) {byte[] bytes1 = new byte[1024 * 1024];//1mbytes1 = new byte[1024 * 1024];//1mbytes1 = new byte[1024 * 1024];//1mbyte[] bytes0 = new byte[128 * 1024];//128kb//直接分配一个5m的对象,由于eden区只有8m,之前已经分配了3m再加上一些未知对象也会占据一定的内存空间,此时必然会引起新生代gcbyte[] bytes3 = new byte[5 * 1024 * 1024];//5m}
}

GC信息:
先对两个demo的代码进行对比,发现demo1只是比demo多新建了一个128k的对象,所以demo1代码GC后的存活对象会比demo代码GC后的存活对象多128k,接着对比下前后两个demo输出的GC信息,会发现老年代依旧还是被占据着1026k的内存空间,但是from区的内存被占用比例从85%升到了98%,这对比下来就很直观了,128k的对象去了哪里?肯定是from区,因为老年代被占用的内存大小根本没变。

总结

如果Survivor区放不下存活对象,存活对象并不是全都进入老年代,而是部分对象进入老年代,部分对象继续被分配到Survivor区。

PS:还有另一种情况,可参考本篇博文【如果发生oldGC,即使survivor区放的下部分存活对象,对象也会全部进入老年代】。

Survivor区放不下存活对象,那么存活对象直接就分配到老年代?相关推荐

  1. JVM内存模型和性能调优:JVM内存分配与回收:Minor GC后存活的对象Survivor区放不下- 第26篇

    Minor GC后存活的对象Survivor区放不下,这种情况会把存活的对象部分挪到老年代,部分可能还会放在Survivor区. (1)当我们的代码中有allocation1和allocation2 ...

  2. jvm配置参数,查看大对象直接分配到老年代

    看下如下代码: 配置参数 -Xms60m -Xms60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails 运行后看下如下,可以看到ParO ...

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

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

  4. 深入理解JVM——(三)为什么JVM新生代需要两个Survivor区

    经过了JVM区域的学习,我们知道在堆中新生代具有一个Eden区和两个Survivor区,这里就有疑问了,为什么需要Survivor区和为什么需要两个Survivor区?带着疑问我们思考一下. 一.为什 ...

  5. JVM的内存结构,Eden和Survivor比例;JVM中一次完整的GC流程,对象如何晋升到老年代,说说你知道的几种主要的JVM参数;CMS 常见参数解析;.你知道哪几种垃圾收集器,各自的优缺点

    47.JVM的内存结构,Eden和Survivor比例 49.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数 50.-XX:+CMSScavengeBefo ...

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

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

  7. 045、JVM实战总结:动手实验:自己动手模拟出对象进入老年代的场景体验一下(上)

    1.前文回顾 略.. 2.动态年龄判定规则 进入老年代的4个时机:1.年龄到了 2.动态年龄判断 3.Survivor 放不下 4.大对象(G1例外) 动态年龄判断:Young GC时,新对象(1岁) ...

  8. JVM 中一次完整的 GC 流程是什么样子的,对象如何晋升到老年代,

    一次完整的gc过程 gc是通过垃圾收集器来实现的,现代垃圾收集器大部分都是基于分代收集理论设计的,也就是将对象划分为新生代,老年代.其中新生代分为Eden区和两块Survivor区,比例为8:1:1. ...

  9. 16-内存分配与回收策略-对象优先分配Eden+大对象进老年代

    1.对象优先在Eden分配 大多数情况下, 对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时, 虚拟机将发起一次Minor GC.HotSpot虚拟机提供了-XX: +PrintGC ...

最新文章

  1. socket io与vue-cli的结合使用
  2. APMServ 5.2.0 服务器平台搭建工具
  3. CoreSight介绍篇
  4. C++中不允许重复定义全局变量
  5. SAP、IFS、Maximo三产品在EAM角度的比较Lenon系列
  6. Kafka实践:到底该不该把不同类型的消息放在同一个主题中
  7. python3.4学习笔记(九) Python GUI桌面应用开发工具选择
  8. openerp 常见问题 OpenERP在哪储存附件?(转载)
  9. NUC1422 字母旋转游戏【水题】
  10. [BZOJ4484][JSOI2015]最小表示(拓扑排序+bitset)
  11. mysql5.1查询分析语句_MySQL 查询数据_mysql 查询语句_SELECT语句
  12. 天翼短信 java_中国电信天翼开放平台自定义短信验证码和模板短信demo
  13. 2021 王道考研 计算机组成原理+习题讲解
  14. 完美世界服务器维护多久,完美世界服务端启动和维护
  15. 2021爱分析·智慧城市厂商全景报告
  16. Java截图转文字程序
  17. python操作Jinkins
  18. html5图片和两行文字垂直居中显示,何如让文字跟图片垂直居中对齐
  19. PHP中curl请求无响应
  20. 归并排序(JAVA版)

热门文章

  1. Python-1036 Boys vs Girls
  2. dreamweaver cs3 序列号-经测试可用
  3. 2022 年安徽省职业院校技能大赛(高职组)“软件测试”竞赛规程
  4. 做文案必备的基础能力是什么?
  5. 如何解决看直播延迟的问题, 求大神帮助。必有重谢!!!
  6. 三种常见的SQL插入语句
  7. css清除浮动4种方法
  8. 关于PyCharm编程中报出ImportError: Missing optional dependency ‘openpyxl‘. Use pip or conda to ins错误的解决办法
  9. 自信的真正含义(管斌全)
  10. linux 信号灯的PV操作