/*** VM参数有这些:* -verbose:gc              : 表示输出虚拟机中GC的详细情况,输出像: [Full GC 168K->97K(1984K), 0.0253873 secs]* -Xms20M                  : 堆内存最小值(单位M)* -Xmx20M                  : 堆内存最大值(单位M)* -Xmn10M                  : 10M的堆内存分配给新生代* -XX:+PrintGCDetails      : 打印详细GC日志* -XX:SurvivorRatio=8      : 新生代中Eden区与一个Survivor区的空间比例是8:1*/
public class Main {private static final int _1MB = 1024 * 1024;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];   //出现一次Minor(新生代) GC}
}

运行结果:

[GC (Allocation Failure) [PSYoungGen: 6250K->808K(9216K)] 6250K->4912K(19456K), 0.0020334 secs] [Times: user=0.11 sys=0.00, real=0.00 secs]
HeapPSYoungGen      total 9216K, used 7244K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)eden space 8192K, 78% used [0x00000000ff600000,0x00000000ffc49088,0x00000000ffe00000)from space 1024K, 78% used [0x00000000ffe00000,0x00000000ffeca020,0x00000000fff00000)to   space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)ParOldGen       total 10240K, used 4104K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)object space 10240K, 40% used [0x00000000fec00000,0x00000000ff002020,0x00000000ff600000)Metaspace       used 3258K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 357K, capacity 388K, committed 512K, reserved 1048576K

运行参数解析:

GC (Allocation Failure)表示本次GC触发的原因是新生代中没有足够的内存来存放新数据而引发的垃圾回收。

PSYoungGen: 6250K->808K(9216K)表示本次GC使用的是Parallel Scavenge新生代收集器,新生代GC前的内存使用为6250K,GC后为808K,新生代的总容量为9216K(Eden 8192K/Survivor 1024K)。

6250K->4912K(19456K)表示堆GC前已使用内存为6250K,GC后为4912K,堆总内存为19456K。

0.0020334 secs表示GC事件的持续时间(Duration),单位是。

[Times: user=0.11 sys=0.00, real=0.00 secs]表示 GC事件的持续时间,通过多种分类来进行衡量:

  • user – 此次垃圾回收, 垃圾收集线程消耗的所有CPU时间(Total CPU time).
  • sys – 操作系统调用(OS call) 以及等待系统事件的时间(waiting for system event)
  • real – 应用程序暂停的时间(Clock time). 由于串行垃圾收集器(Serial Garbage Collector)只会使用单个线程, 所以 real time 等于 user 以及 system time 的总和。

运行过程解析:

执行main()中分配allocation4对象的语句时会发生一次Minor(新生代)  GC,这次GC的结果是新生代6250KB变为808KB,而总内存占用量则几乎没有减少(因为allocation1、allocation2、allocation3三个对象都是存活的,虚拟机几乎没有找到可回收的对象)。这次GC发生的原因是给allocation4分配内存的时候,发现Eden已经被占用了6MB,剩余空间已不足以分配allocation4所需的4MB内存,因此发生Minor  GC。

GC期间虚拟机又发现已有的3个2MB大小的对象全部无法放入Survivor空间(Survivor空间只有1MB大小),所以只好通过分配担保机制提前转移到老年代去。这次GC结束后,4MB的allocation4对象顺利分配在Eden中,因此程序执行完的结果是Eden占用4MB(被allocation4占用),Survivor空闲,老年代被占用6MB(被allocation1、allocation2、allocation3占用)。

【JVM】8_对象优先在Eden分配相关推荐

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

    JVM–基础–09–内存分配策略–对象优先在Eden分配 1.测试 1.1.代码 /*** * @描述:对象优先在Eden分配* @author feiZhou* @date 2018年11月21日上 ...

  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的内存分配与回收策略实战——对象优先在Eden分配

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

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

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

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

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

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

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

  9. JVM的垃圾回收与内存分配

    Java是一种内存动态分配和垃圾回收技术的一种语言,不需要显示的进行对象内存的分配,这一切操作都是由JVM来完成的,由于Java是"一切皆对象"的,所以对于内存分配的优化与速度非常 ...

最新文章

  1. Tomcat内存溢出解决方法
  2. mySql 主从复制linux配置
  3. 深入浅出 消息队列 ActiveMQ(转)
  4. 异常检测——无监督、高斯分布模型,需要带标记的样本数据,基本假设:特征符合高斯分布...
  5. 深度学习 常用python操作(1)
  6. Java_memcached 使用说明
  7. python中fetchall_Python连接MySQL并使用fetchall()方法过滤特殊字符
  8. wps的excel中的单元格限定输入的内容
  9. 2020 年百度之星·程序设计大赛 - 初赛一 GPA DFS深搜
  10. 云数据库MySQL的发展史
  11. “由于应用程序配置不正确,应用程序未启动。重新安装应用程序可能会纠正这个问题。”解决思路
  12. 使用esxcli命令升级VMware ESXi补丁
  13. [重庆思庄每日技术分享]-数据库创建组件时报错ORA-30554: XDB.XDB$ACL_XIDX is disabled
  14. 将OPenCV的Dll 动态连接库改名字,变成自己想要的动态连接库名字
  15. 百度爱番番实时CDP建设实践
  16. Android Studio导入工程项目一直处于gradle....而且一直卡在这个页面
  17. ssd1963初始化程序
  18. SQLServer存储过程中break、continue及return的使用
  19. Cannot access ‘state‘ before initialization
  20. 饮食男女,人之大欲--nbsp;《饮食…

热门文章

  1. 乌云安全所有资料(百度云打包)pdf
  2. php文件更名,怎么用php给文件改名
  3. unity开始游戏代码_Unity的代码之夏开始
  4. 我的世界虚拟服务器联机,我的世界模拟城市联机教程-的世界怎么联机
  5. Watir自动化环境搭建
  6. win7系统32位和64位的区别是什么32位和64位哪一个更好
  7. 2015年电子设计竞赛—增益可控射频放大器
  8. java 获取一天零点零分零秒时间戳
  9. 144hz和60hz测试软件,让我们尝试一下144Hz游戏显示器和60Hz普通显示器之间的区别...
  10. PLC工程师学会编程,是一种什么样的体验?