JVM笔记六-堆区知识之对象生命周期和GC的关系
通过上一篇文章的学习,我们对JVM堆区有了初步的认识,接下来,我们继续展开讲解堆区。
对象生命周期和GC的关系。
我们已经知道了,堆区的新生区分成了三个部分:伊甸园区、幸存者0区、幸存者1区。
其中0区也叫from,1区也叫to区。但是这个from和to是固定不变的吗?NO,NO,NO不是的。当新生区执行一次GC(YGC)后,from和to区会进行交换。交换后,也就是在GC之后,谁空谁是to区。所以,from区和to区的位置和名分不是一成不变的。会发生变化的。
Java堆从GC的角度可以分为:新生区和老年代。这个是从物理分的。
新生代和老年代,占用堆区的比例是:1比2
在新生代中的伊甸园区和幸存者0区、幸存者1区的占比是:8比1比1
从逻辑来分的话,又有永久代(元空间)。如下图:
新生区GC (MinorGC) 的过程:复制->清空->互换
1:复制
eden、Survivor From区 复制到Survivor To区,年龄+1
首先,当Eden区满的时候会触发第一次GC,把还存活的对象拷贝到survivorFrom区,当Eden区再次触发GC的时候,会扫描Eden区和From区域,对这两个区域进行垃圾回收,经过这次垃圾回收后还存活的对象,则直接复制到To区(如果有对象的年龄已经达到了去往老年代的标准,则这些达到标准的对象将会被复制到老年代区),同时把这些对象的年龄+1
2:清空
清空Eden、survivorFrom区
然后,清空Eden和SuriviorFrom中的对象,也即是复制之后有交换。谁空谁做to区。
3:SurvivorTo和SurvivorFrom互换
最后,Survivor To和Survivor From互换,原来Survivor To成为下一次GC的Survivor From区,部分对象会在From和To区中复制来复制去的,如此交换15次(由JVM参赛MaxTenuringThreshold决定的,这个参赛默认值就是15),最终如果还是存活的对象,就把这些存活的对象存入到老年代区域。
这个过程可以有个生活中的case.士兵到将军的过程。士兵上战场,幸存下来,成班长,下次战争来临的时候,班长带着新的士兵继续冲杀,幸存下来,班长升级成排长,以此类推。经历大大小小战役十五次之后,升级成了将军,进入到年老代。
Java7的永久代:
JVM内存管理的模型图如下:
Why?
真相:经过研究,不同对象的生命周期是不同的(废话嘛,不同对象,操作链路长短不一样,当然生命周期不一样了),98%的对象是临时对象(临时对象,就是用完就被回收了)。
实际而言,方法区(Method Area)和堆区一样,是各个线程共享的内存区域,它用于存储虚拟机加载的:类信息+普通常量+静态常量+编译器编译后的代码等等。虽然JVM规范将方法区描述为堆的一个逻辑部分,但是它却还有一个别名:N0n-Heap(非堆),目的就是要和堆区分开的(这句话怎么理解?我们从小教育都知道,台湾是中国的一部分,但是台湾还有个别名:中华台北。其目的就是台湾想在国际上和中国区分开而已)。
对于HotSpot虚拟机,很多开发者习惯将方法区称之为”永久代(Parmanent Gen)”,但严格本质上说两者不同。或者说使用永久代来实现方法区而已,永久代是方法区(相当于是一个接口Interface)的一个实现。JDK1.7的版本中,已经将原本存放永久代的字符串常量池移走了。
三者之间在堆内存中的关系,我们在来看一遍,如下图:
永久代:java7之前
永久存储区是一个常驻内存区域,用于存放JDK自身所携带的Class,Interface的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的内存。
至此,我们已经把JVM堆区讲完了。那么接下来凯哥(凯哥Java:kaigejava)将接着讲解JVM调优命令了。欢迎大家一起继续学习。
JVM笔记六-堆区知识之对象生命周期和GC的关系的更多相关文章
- JVM笔记五-堆区
JVM笔记五-堆区 在JVM中,堆区是重中之重.通过前面文章的学习,我们知道了,栈区是不会有垃圾回收的,所以,经常说的垃圾回收,其实就是回收的是堆区的数据.在这里,我们将会看到传说中的,新生代.老年代 ...
- 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
原文网址:http://blog.csdn.net/weasleyqi/article/details/8090373 iOS视图控制对象生命周期-init.viewDidLoad.viewWillA ...
- .Net组件程序设计之对象生命周期
.Net组件程序设计之对象生命周期 .NET 垃圾回收 IDisposable() Using语句 .NET 垃圾回收 是CLR管理着垃圾回收器,垃圾回收器监控着托管堆,而我们使用的对象以及系统启动是 ...
- Hibernate的三种状态及对象生命周期
理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...
- Ninject之旅之三:Ninject对象生命周期
摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...
- iOS视图控制对象生命周期
iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...
- IOS 视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...
- _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...
- ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理
在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...
- Python学习手册之内部方法、操作符重载和对象生命周期
在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法.操作符重载和对象生命周期. 查看上一篇文章请点击:https://www.cnblogs.com/dust ...
随机推荐
- Java定时任务实现优惠码
在Java中实现定时任务来发放优惠码,我们可以使用多种方法,比如使用java.util.Timer类.ScheduledExecutorService接口,或者更高级的框架如Spring的@Sched ...
- Elastic-Search 整理(二):高级篇
ES高级篇 集群部署 集群的意思:就是将多个节点归为一体罢了,这个整体就有一个指定的名字了 window中部署集群 - 了解 把下载好的window版的ES中的data文件夹.logs文件夹下的所有的 ...
- yb课堂之用户登陆校验拦截器开发 《十一》
开发对应的登陆拦截器 开发loginInterceptor 登陆校验成功放行 登陆不成功返回json数据 LoginInterceptor.java package net.ybclass.onlin ...
- yb课堂 实战之Mybatis打通Mysql数据库 《二》
配置mybatis连接Mysql数据库 server.port=8081 # ========================数据库相关配置===================== spring.d ...
- C#使用SendMessage进行进程间通讯
最近公司有个需求是,拖动文件到桌面图标上,自动打开文件.那么只需在OnStartup事件中通过StartupEventArgs获取文件名然后进行操作即可.操作之后发现当软件已经启动了(单例运行),那么 ...
- 洛谷P1365
WJMZBMR打osu! / Easy 题目背景 原 维护队列 参见 P1903 题目描述 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有 ...
- AI生成前端组件的价值思考
想法来源 这个想法来源于我自己的需求,我自己首先就是最精准的目标用户,在这个AI时代,我希望AI可以帮我尽量多地干活. 结合自己的日常独立开发情况,发现花在调前端组件样式上的时间很多,因此思考能不能让 ...
- Linux 提权-NFS 共享
本文通过 Google 翻译 NFS Share no_root_squash – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- KU FPGA FLASH boot失败debug
原因 新板子回来后,测试flash 烧录正常,但是无法BOOT,此时SPI设置为X4模式,使用内部时钟,速度90M.烧录过程不报错,校验也正常. FLASH理论支持最大速度108M,90M应该还好.另 ...
- TypeScript快速上手
TypeScript快速上手 参考TypeScript零基础入门 轻松搞定ts进行整理 TS文档:TypeScript: The starting point for learning TypeScr ...