白话 垃圾回收之对象优先在Eden分配
借用了这里的一张图,如侵权请联系删除。
这次实战是《深入理解Java虚拟机》 P92 的例题,这里分析加强记忆。
参数
新生代:Parallel Scavenge收集器
老年代:ParOld收集器
具体参数学习请异步这里
-Xms20M:设置JVM最大可用内存/堆为20M。
-Xmx20M:设置JVM促使内存为20m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn10M:设置新生代内存大小10m,那么很容易算出老年代内存10m
-XX:SurvivorRatio = 8 : 新生代中的Eden和一个Survivor的比值8:1。因此Eden = 8M , Survivor = 1M,另一个Survivor = 1M
效果
Eden= 8M ,Survivor = 1M ;则用于存放对象的内存有9M,另外1M用于复制算法。
Old = 10M
执行代码
byte[] a1,a2,a3,a4;int _1MB = 1024 * 1024;a1 = new byte[2 * _1MB];a2 = new byte[2 * _1MB];a3 = new byte[2 * _1MB];a4 = new byte[4 * _1MB];
GC日志
[GC (Allocation Failure) [PSYoungGen: 7110K->1008K(9216K)] 7110K->3402K(19456K), 0.0026423 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
HeapPSYoungGen total 9216K, used 5344K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)eden space 8192K, 52% used [0x00000000ff600000,0x00000000ffa3c170,0x00000000ffe00000)from space 1024K, 98% used [0x00000000ffe00000,0x00000000ffefc040,0x00000000fff00000)to space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)ParOldGen total 10240K, used 6490K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)object space 10240K, 63% used [0x00000000fec00000,0x00000000ff2569b0,0x00000000ff600000)Metaspace used 4740K, capacity 4930K, committed 5248K, reserved 1056768Kclass space used 512K, capacity 561K, committed 640K, reserved 1048576K
由日志也可以看出计算是对的,Eden = 8M, Survivor(from) = 1M ; Old = 10M;
过程分析
a1、a2、a3的建立直接放在Eden区,此时Eden区占用了6M内存,Eden + Survivor剩下3M内存。
a4(4M)生成的时候,可用区域(3M)已经放不下了,因此引发了Minor GC,对照日志的第一行,此次回收把新生代的内存减少了6M,这是什么原因呢?
Minor GC时,启动了复制算法进行GC,而Survivor的内存放不下占用的6M了,因此内存担保把6M直接放到了老年代。a4很自然的放入了新生代。
最终结果:新生代放了a4(4M), 老年代放了a1、a2、a3(6M),也证明了对象优先在Eden分配
白话 垃圾回收之对象优先在Eden分配相关推荐
- jvm深入理解:内存分配与回收策略(优先在Eden分配、大对象直接进入老年代、长期存活的对象将进入老年代、动态对象年龄判定、空间分配担保)
出入:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存. 象的内存分配,从 ...
- JVM--基础--09--内存分配策略--对象优先在Eden分配
JVM–基础–09–内存分配策略–对象优先在Eden分配 1.测试 1.1.代码 /*** * @描述:对象优先在Eden分配* @author feiZhou* @date 2018年11月21日上 ...
- 《深入理解java虚拟机v3》对象优先在Eden分配 > 代码单3-7 新生代Minor GC
对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配.当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. HotSpot虚拟机提供了-XX:+PrintGCDetai ...
- 深入JVM 对象优先在Eden分配
前言:对象的内存分配,大方向讲,指的是对象在堆上分配,对象的主要分配发生在新生代的Eden区,当然少数分配在老年代,分配的规则并不是固定不变的,细节取决于具体的虚拟机实现. --对象优先在Eden区分 ...
- 【JVM】8_对象优先在Eden分配
/*** VM参数有这些:* -verbose:gc : 表示输出虚拟机中GC的详细情况,输出像: [Full GC 168K->97K(1984K), 0.0253873 secs]* -Xm ...
- JVM的内存分配与回收策略实战——对象优先在Eden分配
本文代码在测试时使用的垃圾收集器组合是Serial/Serial Old. 这里还需要介绍一些JVM的基本参数,本文中进行如下设置: -verbose gc 打印垃圾收集信息 -Xms20M 堆容量设 ...
- 16-内存分配与回收策略-对象优先分配Eden+大对象进老年代
1.对象优先在Eden分配 大多数情况下, 对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时, 虚拟机将发起一次Minor GC.HotSpot虚拟机提供了-XX: +PrintGC ...
- JVM学习笔记-GC日志分析(对象优先在Eden区分配)
前言 在进行GC日志分析前,先了解一下JVM虚拟机运行时数据区的主要划分: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域 有各自的用途,以及创建和销毁 ...
- Java中的垃圾回收与对象生命周期
转载自 Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...
最新文章
- 霸榜18年,作者连续20年获得微软MVP,这本SQL书凭什么成为畅销经典
- node环境搭建流程
- Angular之ngx-permissions的路由使用
- linux下iconv编码转换的用法
- 力扣-剑指offer 06 从尾到头打印链表
- 如何实现服务器启动自动创建日志
- win10笔记本电脑双系统 安装黑苹果系统macOS 小白黑苹果乐园下载资源简便安装黑苹果方式,非常详细,还有资源!
- 2022年java知识点汇总,面试大全!超级全面,逐步完善!
- springboot跨域处理
- ValueError: `generator` yielded an element of shape (2,) where an element of shape (?, ?) was expect
- 凸函数(convex)
- Java并发编程:Lock
- 计算机毕业设计 SSM+Vue农家乐管理系统 农家院住宿管理系统 民宿旅游预约管理系统 Java Vue MySQL数据库 远程调试 代码讲解
- 2016计算机2级试题,2016年计算机二级考试题及答案
- Vue移动端系列 => [07] 文章详情
- Bootstrap入门练手小项目,创建一个有侧边栏三级标题可页面跳转的导航
- OTT供应商揭示安全如何影响观众体验
- 睿尔曼 RM65-B 机械臂 WIN 示教软件测试
- w ndows10装什么浏览器,Windows10系统重装不了IE11浏览器如何解决
- linux看电视系统,在Linux系统下收看网络电视节目