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

liruix liruix     2022-10-04     632

关键词:

 虚拟机中的共划分为三个代:年轻代(Young Generation)、老年代(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。

年轻代:

所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

年老代:

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

持久代:

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

 

Scavenge GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

Full GC

对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:

· 年老代(Tenured)被写满

· 持久代(Perm)被写满

· System.gc()被显示调用

·上一次GC之后Heap的各域分配策略动态变化

 

看一段日志:

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask
(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Exception in thread "http-bio-17788-exec-74"
java.lang.OutOfMemoryError: PermGen space
Exception in thread "http-bio-17788-exec-75"
java.lang.OutOfMemoryError: PermGen space
Exception in thread "http-bio-17788-exec-76"
java.lang.OutOfMemoryError: PermGen space

 

gc年轻代老年代持久代

...自:http://www.cnblogs.com/yaoyuan23/p/5587548.html  虚拟机中的共划分为三个代:年轻代(YoungGeneration)、老年代(OldGeneration)和持久代(PermanentGeneration)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关... 查看详情

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

...区域进行回收,这样就会腾出很大的空间出来。2.年轻代中的GC   HotSpotJVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,... 查看详情

jvm内存:年轻代老年代永久代(推荐转)

...bsp;3.方法区的Class信息,又称为永久代,是否属于Java堆?Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象,如下图所示: 在Java中,堆被划分成两个不同的区域:新生代(Young)、老年代(Old)。新生代(Y... 查看详情

jvm:6jvm分代模型:年轻代老年代永久代

1.背景引入JVM内存的分代模型:年轻代、老年代、永久代。我们在代码里创建的对象,都会进入到Java堆内存中,方法的栈帧都会压入到Java虚拟机栈里,而方法如果有局部变量,该局部变量就会在方法所对应栈... 查看详情

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

参考技术A虚拟机中共划分为三个代:年轻代(即新生代)、年老代和持久代。持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。所有新生成的对象首... 查看详情

jvm之年轻代(新生代)老年代永久代以及gc原理详解gc优化

关于JVM,也许你听过这些术语:年轻代(新生代)、老年代、永久代、minorgc(younggc)、majorgc、fullgc不要急,先上图,这是jvm堆内存结构图  仔细的你发现了图中有些分数8/10和1/10,这是默认配置下各个代内存分配比例。举... 查看详情

jvmgc

...图片 GC类型不同的代分为不同的GC类型,一般我们把年轻代叫youngGC,老年代叫oldGC;有些说法是,年轻代叫MinorGC,老年代叫MajorGC;年轻代GC设置年轻代的目的是为了快速回收一些临时对象,遵循原则是少量多次,减轻持续运... 查看详情

jvm垃圾回收--年轻代年老点和持久代(转)(代码片段)

...Tenured/OldGeneration–>老年代PermArea–>永久代 年轻代:  所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而... 查看详情

简单谈谈jvm中的gc(上)

上图就是JVM的分代模型,JVM根据Object的生命周期长短,将其分为上述的三个层次(也称代)。不同的层次,其GC(收集回收)算法不一样YoungGeneration(年轻代、young代)对象的初次创建就会在young代,大部分对象在创建后不再被使... 查看详情

linux使用jstat命令查看jvm的gc情况

...a进成的GC情况,显示内容如下图:结果说明  S0C:年轻代中第一个survivor(幸存区)的容量(字节)S1C:年轻代中第二个survivor(幸存区)的容量(字节)S0U:年轻代中第一个survivor(幸存区)目前已使用空间(字节)S1U:年轻代中... 查看详情

jvm垃圾回收算法及分代垃圾收集器

...到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、... 查看详情

jvm内存设置

...是FullGC后永久区的1.2到1.5倍1.2xto1.5xpermanentgenerationspace】年轻代Xmn的设置为老年代存活对象的1-1.5倍。老年代的内存大小设置为老年代存活对象的2-3倍。BTW:1、Sun官方建议年轻代的大小为整个堆的3/8左右,所以按照上述设置的方... 查看详情

jvm系统优化实践:分代模型

...使用对象,其生存周期也不同。因此,JVM将堆内存划分为年轻代、老年代两个区域。1、年轻代:将创建和使用完之后马上就要回收的对象放在里面;2、老年代:将创建之后需要长期存在的对象放在里面。方法区即永久代(也叫... 查看详情

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

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

jvm09.2运行时数据区堆年轻带/老年代/对象分配过程(代码片段)

...尚硅谷JVM博客来源于大佬整理年轻代与老年代1.存储在JVM中的java对象可以被划分为两类:一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速另外一类对象时生命周期非常长,在某些情况下还能与JVM的生命周期保... 查看详情

jvm年轻代

1.为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪... 查看详情

jvm内存设置多大合适?xmx和xmn如何设置?

...久代PermSize和MaxPermSize设置为老年代存活对象的1.2-1.5倍。年轻代Xmn的设置为老年代存活对象的1-1.5倍。老年代的内存大小设置为老年代存活对象的2-3倍。BTW:1、Sun官方建议年轻代的大小为整个堆的3/8左右,所以按照上述设置的方... 查看详情

jvm之堆内存(年经代,老年代)(代码片段)

一、为什么会有年轻代  我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们... 查看详情