JVM中怎么解析JVM分代垃圾回收策略

技术JVM中怎么解析JVM分代垃圾回收策略这篇文章将为大家详细讲解有关JVM中怎么解析JVM分代垃圾回收策略,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。由于不同对象的生

本文将详细解释如何在JVM中分析JVM生成的垃圾收集策略。这篇文章的内容质量很高,我就分享给大家作为参考。希望你看完这篇文章后有所了解。

由于不同对象的生命周期不同,在JVM的垃圾收集策略中有一个生成策略。

JVM分代垃圾回收策略的基础概念

为什么要分代

JVM生成的垃圾收集策略是基于不同对象的生命周期不同这一事实。因此,不同生命周期的物体可以采用不同的收集方式,以提高回收效率。

在运行Java程序的过程中,会产生大量的对象,其中一些对象与业务信息相关,比如Http请求中的Session对象、线程、Socket连接等,这些对象与业务直接挂钩,因此它们的生命周期相对较长。但是仍然有一些对象,主要是程序运行过程中产生的临时变量,它们的生命周期会比较短。比如String对象,由于其不变的类特性,系统会产生大量这样的对象,有些对象甚至可以回收一次。

想象一下,在不区分对象生命周期的情况下,每次垃圾收集都会回收整个堆空间,这需要相对较长的时间。同时,由于每次都需要遍历所有幸存的对象,实际上对于生命周期长的对象来说,这种遍历是无效的,因为它可能已经被遍历了很多次,但它们仍然存在。因此,世代垃圾收集采用分而治之的思想,分世代,将生命周期不同的对象放在不同的世代上,采用最适合的垃圾收集方式在不同的世代进行回收。

如何分代

如图所示:

JVM中怎么解析JVM分代垃圾回收策略

虚拟机分为三代:年轻一代、老一代和永久一代。持久化生成主要存储Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻一代和老一代的划分对垃圾收集有很大的影响。

年轻代:

所有新生成的对象都首先放在年轻一代中。年轻一代的目标是尽快收集那些生命周期短的物品。年轻一代分为三个区。一个伊甸园区域和两个幸存者区域(一般来说)。大多数对象都是在伊甸园区域生成的。当伊甸园区域满了,幸存的对象将被复制到幸存者区域(两者之一);当这个幸存者区域被填满时,这个区域中幸存的对象将被复制到另一个幸存者区域;当此幸存者区域已满时,从* * *幸存者区域复制的幸存对象将被复制到“终身旧区域”。需要注意的是,《幸存者》的两个区域是对称的,没有顺序关系,所以同一区域可能既有从伊甸园复制的对象,也有从上一个《幸存者》复制的对象,但只有当年旧区域* * *幸存者复制的对象。此外,总是有一个空的幸存者区域。同时,根据节目的需要,Survivor区域可以配置为多个(两个以上),这样可以增加对象在年轻一代的存在时间,减少被放置在老一代的可能性。

年老代:

年轻一代垃圾收集n次存活下来的人,会被放到老一辈。因此,可以认为老一代存储的所有对象都有很长的生命周期。

持久代:

用来存储静态文件,现在是Java类、方法等。持久化生成对垃圾收集没有显著影响,但有些应用程序可能会动态生成或调用一些类,如Hibernate等。在这种情况下,需要设置一个相对较大的持久生成空间来存储运行过程中新添加的这些类。持久生成大小由-XX:MaxPermSize=设置。

什么情况下触发JVM分代垃圾回收

因为对象是分代处理的,所以垃圾收集的区域和时间是不同的。GC有两种类型:清除GC和完全GC。

ScavengeGC

一般来说,当一个新的对象生成,并且在伊甸园中的空间申请失败时,它会触发清除GC,在伊甸园区域执行GC,清除非生物对象,并将幸存的对象移动到幸存者区域。然后组织幸存者的两个区域。这样的GC是在年轻一代的伊甸园地区进行的,不会影响到老一辈。因为大部分对象都是从伊甸园区域开始的,而伊甸园区域不会被分配太多,所以伊甸园区域的GC会频繁进行。因此,这里一般需要使用快速高效的算法,让伊甸园尽快闲置。

FullGC

整理整个堆,包括年轻,拉伸和烫发。FullGC比cleave GC慢,因为它需要回收整个对,所以应该尽可能减少FullGC的数量。在调优JVM的过程中,很大一部分工作是调整FullGC。FullGC可能由以下原因引起:

老年一代(终身职位)已满。

烫发写满。

显示并调用System.gc()。

上次GC后,Heap的各个域分配策略动态变化。

如何分析JVM中JVM生成的垃圾收集策略,希望在此分享。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/44229.html

(0)

相关推荐

  • openwrt设置远程管理(openwrt模式怎么设置)

    技术OpenWRT如何启用工作模式开关和联网小编给大家分享一下OpenWRT如何启用工作模式开关和联网,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 主要配置 rc.local 脚本,内容如下:r

    攻略 2021年12月18日
  • JDBC中的批处理是什么

    技术JDBC中的批处理是什么这篇文章将为大家详细讲解有关JDBC中的批处理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 直接上代码:packagec

    攻略 2021年11月19日
  • 原来有openwrt怎么升级固件(openwrt升级固件时间15分钟)

    技术OpenWRT如何升级固件小编给大家分享一下OpenWRT如何升级固件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! OpenWRT

    攻略 2021年12月18日
  • 怎么使用jQuery选择器

    技术怎么使用jQuery选择器本篇内容介绍了“怎么使用jQuery选择器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先

    攻略 2021年11月18日
  • 怎么理解游戏的Draw Calls

    技术怎么理解游戏的Draw Calls这篇文章主要讲解了“怎么理解游戏的Draw Calls”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解游戏的Draw Call

    攻略 2021年11月1日
  • Linux系统中怎么使用TFTP

    技术Linux系统中怎么使用TFTP这篇文章主要讲解了“Linux系统中怎么使用TFTP”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux系统中怎么使用TFTP”吧

    攻略 2021年11月30日