通过上一篇文章的学习,我们对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的关系的更多相关文章

  1. JVM笔记五-堆区

    JVM笔记五-堆区 在JVM中,堆区是重中之重.通过前面文章的学习,我们知道了,栈区是不会有垃圾回收的,所以,经常说的垃圾回收,其实就是回收的是堆区的数据.在这里,我们将会看到传说中的,新生代.老年代 ...

  2. 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

    原文网址:http://blog.csdn.net/weasleyqi/article/details/8090373 iOS视图控制对象生命周期-init.viewDidLoad.viewWillA ...

  3. .Net组件程序设计之对象生命周期

    .Net组件程序设计之对象生命周期 .NET 垃圾回收 IDisposable() Using语句 .NET 垃圾回收 是CLR管理着垃圾回收器,垃圾回收器监控着托管堆,而我们使用的对象以及系统启动是 ...

  4. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  5. Ninject之旅之三:Ninject对象生命周期

    摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...

  6. iOS视图控制对象生命周期

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  7. IOS 视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  8. _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  9. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

  10. Python学习手册之内部方法、操作符重载和对象生命周期

    在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法.操作符重载和对象生命周期. 查看上一篇文章请点击:https://www.cnblogs.com/dust ...

随机推荐

  1. GraqphQL 学习

    GraphQL是Graph+QL.Graph是图,描述数据最好的方式是图数据结构(包括树),数据和数据之间,有像图一样的联系,以图的思维来考虑数据.QL是query language,像写query语 ...

  2. FPGA bit转bin文件

    首先科普一下 什么是bitstream文件 FPGA比特流(bitstream)是一种用于配置可编程逻辑器件的数据格式,特别是现场可编程门阵列(FPGA).比特流包含了硬件逻辑电路.路由信息以及芯片上 ...

  3. 🎉我是如何从零到成为 Apache 顶级项目的 Committer

    最近收到了 Apache Pulsar 和 Apache HertzBeat社区的邀请邮件,成为了这两个项目的 Committer. 一路走来我从最开始的打游击战的闲散人员到如今活跃在各个开源项目里的 ...

  4. pyspark集成访问hive数据踩坑记录

    当前环境anaconda3.python3.9.13.jupyter 需要安装的pyspark.py4j pyspark和py4j的离线安装包地址Links for pyspark (tsinghua ...

  5. SSRF结合Redis未授权的打法

    目录 SSRF + Redis未授权 案例 怎么构造 redis 数据包? Reference SSRF不难理解,服务器端请求伪造(英语:Server-side Request Forgery,简称S ...

  6. 集群及分布式定时任务中间件MEE_TIMED

    集群及分布式定时任务中间件MEE_TIMED 转载请著名出处:https://www.cnblogs.com/funnyzpc/p/18312521 MEE_TIMED一套开源的定时任务中间件,MEE ...

  7. Windows11下使用VcXsrv+xfce4实现图形化窗口

    通过 sudo apt-get install xfce4-terminal sudo apt-get install xfce4 sudo service dbus restart 来安装所需要的软 ...

  8. 简单的字符串处理函数_C语言

    字符串数组 // Code file created by C Code Develop #include "stdio.h" #include "stdlib.h&qu ...

  9. 写写Redis十大类型zset的常用命令

    其实这些命令官方上都有,而且可读性很强,还有汉化组翻译的http://redis.cn/commands.html,不过光是练习还是容易忘,写一写博客记录一下 从zset类型开始写||zset类型适合 ...

  10. P1081 [NOIP2012 提高组] 开车旅行

    思路: 首先令 \(nxt1_i\) 表示右侧最近的城市距离(\(id1_i\) 为编号),令 \(nxt2_i\) 表示右侧第二近的城市编号(\(id2_i\) 为编号):可以使用 set 找出离这 ...