JVM–基础–09–内存分配策略–对象优先在Eden分配


1、测试

1.1、代码


/*** * @描述:对象优先在Eden分配* @author    feiZhou* @date 2018年11月21日上午8:30:41* @version 1.0*/
public class EdenAllocation1 {private static final int _1MB = 1024*1024;/*** VM参数:-XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8*/@SuppressWarnings("unused")public static void main(String[] args) {byte[] allocation1,allocation2,allocation3,allocation4;allocation1 = new byte[2 * _1MB];allocation2 = new byte[2 * _1MB];allocation3 = new byte[2 * _1MB];allocation4 = new byte[4 * _1MB];}
}

2.2、日志


[GC (Allocation Failure) [DefNew: 7808K->603K(9216K), 0.0062181 secs] 7808K->6747K(19456K), 0.0074891 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
Heapdef new generation   total 9216K, used 4781K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)eden space 8192K,  51% used [0x00000000fec00000, 0x00000000ff014930, 0x00000000ff400000)from space 1024K,  58% used [0x00000000ff500000, 0x00000000ff596d10, 0x00000000ff600000)to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)tenured generation   total 10240K, used 6144K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)the space 10240K,  60% used [0x00000000ff600000, 0x00000000ffc00030, 0x00000000ffc00200, 0x0000000100000000)Metaspace       used 3199K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 346K, capacity 388K, committed 512K, reserved 1048576K

3、分析

3.1、JVM配置

  1. 堆内存20MB,其中新生代10MB,老年代10MB
  2. 新生代区域的分配比例是 8:1:1,也就是说
    1. eden 区 8192K
    2. from 区 1024K
    3. to 区 1024K
    4. 新生代总可用空间为9216KB(Eden区+1个from区的总容量)
  3. 使用Serial/Serial Old组合收集器。

3.2、当 allocation1、allocation2、allocation3 分配进内存的时候

其他系统对象:7808K-210243K=1664K

3.3、当 分配allocation4对象 的时候

由于eden去空间不够,发生Minor GC

3.3.1、日志解读


[GC (Allocation Failure) [DefNew: 7808K->603K(9216K), 0.0062181 secs] 7808K->6747K(19456K), 0.0074891 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
Heap

GC :

代表发生了一次垃圾回收,前面没有Full修饰,表明这时一次Minor GC;

Allocation Failure:

表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。

7808K->603K(9216K):

三个参数分别为:GC前该内存区域(年轻代)使用容量,GC后该内存区域使用容量,该内存区域总容量。

7808K->6747K(19456K)

三个参数分别为:堆区垃圾回收前的大小,堆区垃圾回收后的大小,堆区总大小。

0.0074891 secs

代表本次新生代GC耗时

年轻代回收空间

7808K-603K=7205K=7.0361M

堆回收空间

7808K-6747K=1061K

进入老年代空间

7205K-1061K=6144K=6M

3.3.2、分析

因为allocation1、 2、 3三个对象是强引用,不会被回收,所以都是存活。

产生这次垃圾收集的原因是为allocation4分配内存时, 发现Eden已经被占用了6MB, 剩余空间已不足以分配allocation4所需的4MB内存, 因此发生Minor GC。

垃圾收集期间虚拟机又发现已有的三个2MB大小的对象全部无法放入Survivor空间(Survivor空间只有1MB大小),所以只好通过分配担保机制,将allocation1、 2、 3转移到老年代去。

最后Eden空闲出来了就可以放allocation4,消耗内存4M。

因此程序执行完的结果是Eden占用4MB(被allocation4占用) , Survivor空闲, 老年代被占用6MB(被allocation1、 2、 3占用) 。
通过GC日志可以证实这一点。 (tenured generation total 10240K, used 6144K)

JVM--基础--09--内存分配策略--对象优先在Eden分配相关推荐

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

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

  2. 白话 垃圾回收之对象优先在Eden分配

    借用了这里的一张图,如侵权请联系删除. 这次实战是<深入理解Java虚拟机> P92 的例题,这里分析加强记忆. 参数 新生代:Parallel Scavenge收集器 老年代:ParOl ...

  3. 《深入理解java虚拟机v3》对象优先在Eden分配 > 代码单3-7 新生代Minor GC

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

  4. 深入JVM 对象优先在Eden分配

    前言:对象的内存分配,大方向讲,指的是对象在堆上分配,对象的主要分配发生在新生代的Eden区,当然少数分配在老年代,分配的规则并不是固定不变的,细节取决于具体的虚拟机实现. --对象优先在Eden区分 ...

  5. 【JVM】8_对象优先在Eden分配

    /*** VM参数有这些:* -verbose:gc : 表示输出虚拟机中GC的详细情况,输出像: [Full GC 168K->97K(1984K), 0.0253873 secs]* -Xm ...

  6. JVM的内存分配与回收策略实战——对象优先在Eden分配

    本文代码在测试时使用的垃圾收集器组合是Serial/Serial Old. 这里还需要介绍一些JVM的基本参数,本文中进行如下设置: -verbose gc 打印垃圾收集信息 -Xms20M 堆容量设 ...

  7. JVM学习笔记-GC日志分析(对象优先在Eden区分配)

    前言 在进行GC日志分析前,先了解一下JVM虚拟机运行时数据区的主要划分: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域 有各自的用途,以及创建和销毁 ...

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

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

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

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

最新文章

  1. 利用classloader同一个项目中加载另一个同名的类_线程上下文类加载器ContextClassLoader内存泄漏隐患...
  2. 给XCODE加一个注释的小插件
  3. 数据库系统为什么使用三级模式结构
  4. 压缩比13为什么建议用92的油_92号和95号汽油,哪个更耐烧?车主:欢迎入坑
  5. mysql删除完全重复数据库_MySQL中删除完全重复数据的准确SQL语句
  6. 解决mysql表被crash的一次维护始末
  7. 利用Spring解耦VS的WebService
  8. SQL 全文索引 CONTAINS
  9. 创建一个对象和i++是否原子性的理解
  10. 【服务器】【个人网盘】宝塔搭建cloudreve
  11. 软考网络工程师笔记-分值分布
  12. TDD、FDD是什么意思?
  13. 4800u功耗测试软件,ryzen controller---移动端锐龙处理器解锁功耗工具(附使用方法)...
  14. Ring Buffer (circular Buffer)环形缓冲区简介
  15. Spark学习-入门介绍
  16. 飞控中加速度计数据fft分析
  17. 关于前端调用微信二维码支付,二维码无法显示的问题
  18. html制作收货地址页面,css 收货地址平行四边形的线条样式示例代码
  19. Oracle海量数据清理-表空间释放
  20. 微信收款码如何隐藏真实姓名的最后一个字

热门文章

  1. RabbitVCS:ubuntu下svn可视化工具的安装和使用
  2. python道德经摘要
  3. 详解开发、实施、运维的区别
  4. Android五大布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout和TableLayout
  5. bootstrap 导航栏鼠标悬停显示下拉菜单
  6. 最高要价 8888元,小米 11 邀请函现身闲鱼;马斯克曾考虑把特斯拉卖给苹果却被拒;我国区块链专利全球居首 | EA周报...
  7. 美国TELEMARK电源维修电子枪高压控制电源修理
  8. UV云任务小米运动步数修改PHP网站源码
  9. eclipse版本与jdk版本不匹配怎么办?
  10. tflearn教程_Tensorflow tflearn 编写RCNN