JVM年轻代(young generation)老年代(old generation tenured)持久代(permanent generation)GC

转载 2016年10月19日 15:22:26

关于jvm内存代,看到这篇文章,转发下

链接地址 ---多谢

   虚拟机中的共划分为三个代:年轻代(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留给自己用的


原文地址:

http://www.cnblogs.com/yaoyuan23/p/5587548.html


内存代管理器TenuredGeneration对垃圾对象的回收

内存代管理器TenuredGeneration作为基于内存分代管理的内存堆管理器GenCollectedHeap默认的旧生代管理器,它对垃圾对象的回收算法要比年青代Gc要复杂的多,但其主体思路就是:标...
  • xhh198781
  • xhh198781
  • 2015年01月18日 15:57
  • 2142

深入JVM系列(二)之GC机制、收集器与GC调优

一、回顾JVM内存分配 需要了解更多内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配 1.1、内存分配: 1、对象优先在EDEN分配 2、大对象直接进入...
  • kobejayandy
  • kobejayandy
  • 2013年01月12日 18:00
  • 18645

java.lang.OutOfMemoryError: PermGen space及其解决方法

  PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,...
  • fengyie007
  • fengyie007
  • 2007年09月11日 12:34
  • 659140

JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:...
  • sd4015700
  • sd4015700
  • 2015年11月30日 11:30
  • 1525

JVM内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)

JVM区域总体分两类,heap区和非heap区。 heap区又分为: - Eden Space(伊甸园)、 - Survivor Space(幸存者区)、 - Old Gen(老年代)...
  • shiyong1949
  • shiyong1949
  • 2016年09月19日 14:05
  • 9449

JVM调优总结

此篇文章用于查内存泄漏和FullGC 因为在Linux环境,用jdk自带的jmap工具(Linux/Unix环境特有的),可以对进程中的内存对象监视,然后就运行命令 jmap -histo [pid]...
  • jiangguilong2000
  • jiangguilong2000
  • 2013年01月07日 12:19
  • 6220

JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:...
  • aoxida
  • aoxida
  • 2015年04月15日 16:43
  • 3037

JVM学习笔记二 :垃圾收集的过程分析Eden->Survivor->Tenured

内存申请过程 JVM会试图为相关Java对象在Eden中初始化一块内存区域; 当Eden空间足够时,内存申请结束。否则到下一步; JVM试图释放在Eden中所有不活跃的对象(minor ...
  • duj671
  • duj671
  • 2016年03月11日 17:27
  • 2914

JVM GC调优一则--增大Eden Space提高性能

缘起 线上有Tomcat升级到7.0.52版,然后有应用的JVM FullGC变频繁,在高峰期socket连接数,Cpu使用率都暴增。 思路 思路是Tomcat本身的代码应该是没有问题的,有问题的可能...
  • hengyunabc
  • hengyunabc
  • 2014年05月03日 18:29
  • 34119

Java堆内存_Young Gener_Old Generation_新生代和老年代

使用JDK8 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新...
  • pursuer211
  • pursuer211
  • 2017年02月06日 22:58
  • 982
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM年轻代(young generation)老年代(old generation tenured)持久代(permanent generation)GC
举报原因:
原因补充:

(最多只允许输入30个字)