通过上一篇文章的学习,我们对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. windows中运行nicegui官网内容

    内容受到bilibili视频nicegui官网访问不了?教你本地部署文档,我写python终于有界面启发,其余部分由chatgpt协助生成. 1. 在本地新建目录如 nicegui_web 2. 从g ...

  2. 基于 tc 指令的网速限制工具

    前言 最近有一个需求,需要限制网卡速度进行一些测试.在朋友推荐下阅读了这篇文章 TC简单粗暴限制网速. 经过尝试,简单有效,整理成脚本放在正文,留作参考. 正文 指令解析(chatgpt 分析) 您提 ...

  3. 大语言模型的应用探索—AI Agent初探!

    前言 大语言模型的应用之一是与大语言模型进行聊天也就是一个ChatBot,这个应用已经很广泛了. 接下来的一个应用就是AI Agent. AI Agent是人工智能代理(Artificial Inte ...

  4. Python获得操作日志的最后几行记录

    该方法一般用于获得操作日志的最后几行记录 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 f = open('seek.txt', 'rb') 4 ...

  5. [oeasy]python0048_取整_int_float_浮点型_cast_扮演_tab_制表键_制表符

    转化为10进制 回忆上次内容 上次 把其他进制 转化回 十进制 用的是 int 函数 int 来自于 integer 同源词 还有 integrate entire 意思都是完整的 完整的 和 零散的 ...

  6. 题解:P10781 【MX-J1-T1】『FLA - III』Spectral

    本题的主要思路就是数学. 首先,让我们先来打一个表. \(i\) \(1\) \(2\) \(3\) \(4\) \(\dots\) \(T_{i}\) \(k\) \(1.5k\) \(1.5k\) ...

  7. 服务端渲染中的数据获取:结合 useRequestHeaders 与 useFetch

    title: 服务端渲染中的数据获取:结合 useRequestHeaders 与 useFetch date: 2024/7/24 updated: 2024/7/24 author: cmdrag ...

  8. nginx的一些功能

    一.四层(tcp/udp)代理 由于nginx默认是不支持四层代理的因此在安装的时候需要加上对应的模块with-stream ./configure --with-stream # 查看当前nginx ...

  9. hbuilderx生成ios证书和上架全教程

    现在很多公司都使用uniapp作为底层框架来开发app应用,而uniapp的开发工具hbuilderx云打包的时候,需要证书和证书profile文件. 假如是ios应用,则还需要上架到appstore ...

  10. 【Python】Django学习1

    按黑马程序员的美多商场作方向: https://www.bilibili.com/video/BV1nf4y1k7G3 一.应用创建.注册处理.配置 Pycharm 创建Django项目: 自应用注册 ...