jvm垃圾回收--年轻代年老点和持久代

狗哥 狗哥     2022-11-18     116

关键词:

年轻代:

  一般情况下,所有新生成的对象首先都是放在年轻代的。年轻代的目的就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(分别叫from和to)Eden区与一个Survivor区的空间比例默认为8:1。

  对象在Eden区中分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。如果对象仍然存活,并且能被Surivivor容纳,将被移动到Survivor To区中。而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值 -- 默认为15,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

  为什么要分两个Surivivor区:最大的好处就是解决了碎片化。

  因为采用的是复制算法。将原有的内存空间划分成两块,每次只使用其中一块,在垃圾回收的时候,将正在使用的内存中的存活对象复制到另一块内存区域中,然后清除正使用过的内存区域,交换两个区域的角色,完成垃圾回收。

  为什么要是用复制算法:因为新生代gc比较频繁、对象存活率低,用复制算法在回收时的效率会更高,也不会产生内存碎片。但复制算法的代价就是要将内存折半,为了不浪费过多的内存,就划分了两块相同大小的内存区域survivor from和survivor to。在每次gc后就会把存活对象给复制到另一个survivor上,然后清空Eden和刚使用过的survivor。

年老代:

  长期存活的对象将进入年老代。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

持久代:

  用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。

重点:

  • 在java中,对象实例都是在堆上创建。一些类信息,常量,静态变量等存储在方法区。堆和方法去都是线程共享的。
  • GC机制是由JVM提供,用阿里清理需要清除的对象。回收堆内存。
  • 在从内存回收一个对象之前会调用对象的finalize()方法,但是同一个对象只会调用一次。
  • System.gc()和Runtime.gc()会向JVM发送执行GC的请求,但是JVM不保证一定会执行GC。
  • 如果堆内存不足以创建新对象。会跑出OutOfMemoryError。

 

第四章hotspotjvm中的垃圾回收机制

...到年老代的大对象。持久代存放的是JVM认为可以帮助简化垃圾 查看详情

垃圾回收机制

...用该对象)回收无用对象所占的内存空间分代机制:分代垃圾回收机制,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率.我们将对象分为三种状态... 查看详情

jvm如何gc,新生代,老年代,持久代,都存储哪些东西

...老代和持久代。持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。所有新生成的对象首先都是放在年轻代的年老代中存放的都是一些生命周期较长的... 查看详情

jvm的垃圾算法有哪几种

一、垃圾收集器概述如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用二、各个垃圾... 查看详情

jvm常见配置

...设置并行年老代收集器-XX:+UseConcMarkSweepGC:设置并发收集器垃圾回收统计信息-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xloggc:filename并行收集器设置-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。-XX:MaxGCPauseM... 查看详情

jvm调优及参数设置

...mx :最大堆大小此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存-Xmn :年轻代大小整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,... 查看详情

jvm年轻代老年代持久代gc

...tGeneration)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。年轻代:所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速... 查看详情

jvm之几种垃圾收集器简单介绍

本文中的垃圾收集器研究背景为:HotSpot+JDK1.7一、垃圾收集器概述如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。JVM会从年轻代和年老代各选出一个算法进行组合,连... 查看详情

jvm中的年轻代老年代持久代gc

...tGeneration)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。年轻代:所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速... 查看详情

jvm性能优化

...存放java分配的新对象。   (2)年老代:经过垃圾回收没有被回收掉的对象被复制到年老代   (3)永久代:存放clas 查看详情

java垃圾回收机制(未掌握)

垃圾回收机制任何一种垃圾回收算法一般要做两件基本事情:发现无用的对象(没有任何变量引用该对象)回收无用对象占用的内存空间垃圾回收相关算法:引用计数法,引用可达法分代垃圾回收机制:不同的对象的生命周期是不一样的... 查看详情

java堆内存

...些生命周期短的对象。 2、年老代在年轻代经历了N次垃圾回收仍然存在的对象就被放入年老代。 3、持久代存放静态文件,如Java类和方法,有些应用会动态生成和调用一些cl 查看详情

jvm-内存分配与垃圾回收

内存分配:整个内存:堆内存(年轻代大小+年老代大小)+非堆(持久代)。1、堆参数:-Xms:初始内存,默认是物理内存的1/64。-Xmx:最大内存,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限... 查看详情

jvm常用参数

...其实就是启用多线程去执行-XX:+UseConcMarkSweepGC启用CMS做为垃圾收集-XX:+UseCMSInitiatingOccupancyOnly只有开启了这个参数,CMSInitiatingOccupancyFraction这个参数才会生效-XX:CMSInitiatingOccupancyFraction=70CMS垃圾收集器,当老年代达到70%时,触发CMS... 查看详情

jvm垃圾回收补充知识点

1、分代虚拟机中的共划分为三个代:        年轻代(YoungGen):eden和survivor-8:1:1  年老代(OldGen):存储大对象,由survivor晋升  永久代(permGen):permgen含classmetadata、classstaticvariables和internedstr... 查看详情

gc垃圾回收

gc=fullgc+younggcJavajvm内存=堆内存+非堆内存堆内存(-Xms-Xmx)=年轻代(-Xmn)+年老代-Xms,初始分配内存,-Xmx最大分配内存,一般情况下设置成一样的值年轻代=Eden+s0+s1非堆内存=持久代(-XX:PermSize-XX:MaxPermSize)+codecache(-XX:reservedcodecac... 查看详情

垃圾回收机制

垃圾回收机制垃圾回收一般分为两步,分别是:1、发现无用的对象2、回收无用对象站用的内存空间垃圾回收常用的两种算法:1、引用计数法(优点是算法简单,缺点是:循环引用大额无用对象无法识别&#x... 查看详情

堆内存设置以及垃圾回收方式

...代(PermanentGeneration),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。Heap={Old+NEW={Eden,from,to}},Old即年老代(OldGeneration),New即 年轻代(YoungG 查看详情