gc年轻代老年代持久代

不好说 不好说     2022-09-13     401

关键词:

转载自:http://www.cnblogs.com/yaoyuan23/p/5587548.html

 

 虚拟机中的共划分为三个代:年轻代(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
复制代码

     明显可以看出是老年代的内存溢出,说明在容器下的静态文件过多,比如编译的字节码,jsp编译成servlet,或者jar包。

     解决此问题,修改jvm的参数 permsize即可,permsize初始默认为64m。

 

   jvm内存参数

-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
-vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了
-Xms128m JVM初始分配的堆内存
-Xmx512m JVM最大允许分配的堆内存,按需分配
-XX:PermSize=64M JVM初始分配的非堆内存
-XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配

 

堆(Heap)和非堆(Non-heap)内存

 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。
 可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,

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

 虚拟机中的共划分为三个代:年轻代(YoungGeneration)、老年代(OldGeneration)和持久代(PermanentGeneration)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收... 查看详情

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

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

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

参考文章: 1.Java新生代、老年代、持久代、元空间 2.Java内存与垃圾回收调优 3.方法区的Class信息,又称为永久代,是否属于Java堆?Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象,如下图... 查看详情

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垃圾回收算法及分代垃圾收集器

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

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

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

gc垃圾回收

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

每日一面-java中,描述一下什么情况下,对象会从年轻代进入老年代?(代码片段)

本问题参考自:https://www.zhihu.com/question/437632685,解答为个人原创KeyTakeawayJava默认启用了分代GC启用分代GC的,在发生YoungGC,更准确地说是在Survivor区复制的时候,存活的对象的分代年龄会加1。当分代年龄=-XX... 查看详情

jvm内存设置

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

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

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

javagc变量含义(s0s1eopygcygctfgcfgctgct)(代码片段)

S0C:年轻代中第一个survivor(幸存区)的容量(kb)S1C:年轻代中第二个survivor(幸存区)的容量(kb)S0U:年轻代中第一个survivor(幸存区)目前已使用空间(kb)S1U:年轻代中第二个survivor(幸存... 查看详情

jvmyounggen(新生代),oldgen(年老代),和permgen(持久区)

...数次回收将依然存活的对象复制到OldGen区。OldGen当对象从年轻代晋升到老年代之前,会检测老年区的剩余空间是否大于要晋升对象的大小,如果小于则直接进行一次FullGC,以便让老年去腾出更多的空间,然后再进行MinorGC 查看详情

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

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

jvm工具类——jstat(代码片段)

...用大小 CCSC压缩类空间大小CCSU压缩类空间使用大小YGC年轻代垃圾回收次数YGCT年轻代垃圾回收消耗时间FGC老年代垃圾回收次数FGCT老年代垃圾回收消耗时间GCT垃圾回收消耗总时间2. gcutil  统计gc时,heap情况 S0幸存1... 查看详情