JVM学习笔记二 :垃圾收集的过程分析Eden-Survivor-Tenured
内存申请过程
- JVM会试图为相关Java对象在Eden中初始化一块内存区域;
- 当Eden空间足够时,内存申请结束。否则到下一步;
- JVM试图释放在Eden中所有不活跃的对象(minor collection),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
- Survivor区被用来作为Eden及old的中间交换区域,当old区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
- 当old区空间不够时,JVM会在old区进行major collection;
- 完全垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误";
对象衰老过程
新创建的对象的内存都分配自eden。Minor collection的过程就是将eden和在用survivor space中的活对象copy到空闲survivor space中。对象在young generation里经历了一定次数(可以通过参数配置)的minor collection后,就会被移到old generation中,称为tenuring。
GC触发条件
GC类型 | 触发条件 | 触发时发生了什么 | 注意 | 查看方式 |
Minor GC |
eden空间不足 |
(1)清空Eden+from survivor中所有no ref(无引用)的对象占用的内存 ▲重新调整Eden 和from的大小(parallel GC会触发此项) |
全过程暂停应用 是否为多线程处理由具体的GC决定 |
jstat –gcutil gc log |
Full GC |
(1)old空间不足 (2)perm空间不足 (3)显示调用System.GC, RMI等的定时触发 (4)YGC时的悲观策略 (5)dump live的内存信息时(jmap –dump:live) |
(1)清空heap中no ref的对象 (2)permgen(永久代)中已经被卸载的classloader中加载的class信息 (3)如配置了CollectGenOFirst,则先触发YGC(针对serial GC) (4)如配置了ScavengeBeforeFullGC,则先触发YGC(针对serial GC) |
全过程暂停应用 是否为多线程处理由具体的GC决定 是否压缩需要看配置的具体GC |
jstat –gcutil gc log |
GC信息的格式
[GC [<collector>: <starting occupancy1> -> <ending occupancy1>, <pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3> secs]
<collector> GC为minor收集过程中使用的垃圾收集器起的内部名称.
<starting occupancy1> young generation 在进行垃圾收集前被对象使用的存储空间.
<ending occupancy1> young generation 在进行垃圾收集后被对象使用的存储空间
<pause time1> minor收集使应用暂停的时间长短(秒)
<starting occupancy3> 整个堆(Heap Size)在进行垃圾收集前被对象使用的存储空间
<ending occupancy3> 整个堆(Heap Size)在进行垃圾收集后被对象使用的存储空间
<pause time3> 整个垃圾收集使应用暂停的时间长短(秒),包括major收集使应用暂停的时间(如果发生了major收集).
深入JVM系列(二)之GC机制、收集器与GC调优
JVM学习笔记二 :垃圾收集的过程分析Eden-Survivor-Tenured相关推荐
- JVM学习笔记(二):垃圾收集
程序计数器. 虚拟机栈. 本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作. 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这 ...
- JVM学习笔记_垃圾收集器重要参数
目录 -XX:+UseParallelGC -XX:+UseSerialGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:PretenureSizeThr ...
- java jvm学习笔记二(类装载器的体系结构)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱, ...
- JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇
二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...
- JVM学习笔记二:JVM参数
所有线程共享的内存主要有两块:堆内存和方法区. 其中堆内存分为两块:新生代Young generation(Eden区.From Survivor区.To Survivor区).老年代Tenured ...
- JVM 学习笔记二十六、JVM监控及诊断工具-GUI篇
二十六.JVM监控及诊断工具-GUI篇 1.工具概述 使用上一张命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但他们存在下列局限: (1)无法获取方法级别的分析数据,如方法间的调用关系 ...
- wxpython应用程序对象与顶级窗口_wxPython学习笔记(二)
如何创建和使用一个应用程序对象? 任何wxPython应用程序都需要一个应用程序对象.这个应用程序对象必须是类wx.App或其定制的子类的一个实例.应用程序对象的主要目的是管理幕后的主事件循环. 父类 ...
- jvm学习笔记(二)
jvm学习笔记(二) 文章目录 jvm学习笔记(二) 1.全部笔记链接 2. Native关键字 3.关于JVM规范 3.1 JVM规范中运行时数据区的概念 4.HotSpot的JVM运行时数据区 4 ...
- 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明
目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...
最新文章
- Kruskal算法构造最小生成树
- SOA Notes
- 【python】简单记录
- 回溯法——旅行售货员问题
- 论文浅尝 | 基于对抗学习的弱监督知识图谱对齐
- Postgresql 8.2.15 安装文档
- KVM虚拟机openVSwitch杂记(2)
- MATLAB中ones()函数的用法
- ADS 2013 momentum仿真出错
- 关于UML 画图工具EA 在linux下的安装和界面配置
- Windows 序列号查看
- allegro 自定义快捷键
- 数字图像处理:对数变换
- pytorch中torch.cholesky()函数的使用
- Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)
- Python实现冒泡排序的代码
- 挑战程序设计竞赛笔记-贪心算法
- 华中农业大学教务系统自动评教脚本
- CTF 2017强网杯
- 如何打造一个最强大的“自我”