JVM之堆的体系结构

1、堆的体系结构

Heap 堆一个JVM 实例只存在一个堆内存,堆内存的大小是能够调节的。类加载器读取了类字节码文件后,须要把类、方法、常量、变最放到堆内存中,保存全部引用类型的真实信息,以便执行器执行。
堆内存分为三部分:java

  • Young Generation space 新生区 Young/New
  • Tenure generation space 养老区 Old/Tenure
  • Permanent space 永久代 Perm(JDK1.8 修改成MetaSpace,该区域从JVM的堆内存中移动到系统的本地内存;既JDK1.8的堆体系结构=新生代+老年代+MetaSpace),永久代在逻辑上在堆内存空间,但在物理上永久代与堆是独立的。方法区是规范,JVM的永久代是实现,元空间也是方法区的一个实现

新生区:新生区是类的诞生、成长、消亡的区域,一个类在该这产生、应用,最后被垃圾回收器收集,结束生命。新生区又分为两部分:伊甸区(Eden space)和两个幸存者区(Survivor Space) 或者是Survivor  form 和 Survivor  to,全部的类都是在伊甸区被new 出来的。当伊甸园的空间用完时,程序又须要建立对象,JVM 的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC ) ,在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中全部存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到必定值(年龄阈值,能够经过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。通过此次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。无论怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满以后,会将全部对象移动到年老代中。若老年代也满了,那么这个时候将产生 Major GC(Full GC),进行老年代的内存清理。若老年代执行了Full GC以后发现依然没法释放足够的内存,进行对象的保存,就会产生 OOM 异常 OutOfMemoryError。缓存

若是出现 java.lang.OutOfMemoryError : Java heap space 异常,说明Java 虚拟机的堆内存不够,缘由是:
一、Java 虚拟机的堆内存设置不够,能够经过参数 -Xms -Xmx 来调整
二、代码中建立了大量对象,且长时间不能被垃圾收集器收集(存在被引用),须要咱们从代码的角度寻找问题spa

老年代:经历屡次Minor  GC 依然存活的对象会进入老年代;链接池的对象通常会进入老年代,常驻内存的内存缓存通常也会进入老年代;orm

新生代到老年代的通常场景:对象

  • 一、普通状况下 经过设置该参数 XX:MaxTenuringThreshold 
  • 二、分配的对象空间大于eden space。
  • 三、eden space剩余空间不足分配,且须要分配对象内存不小于eden space总空间的一半,直接分配到老年代,不触发Minor GC。适合-XX:+UseParallelGC、-XX:+UseParallelOldGC,即适合Parallel Scavenge。
  • 四、大对象直接进入老年代,使用-XX:PretenureSizeThreshold参数控制,适合-XX:+UseSerialGC、-XX:+UseParNewGC、-XX:+UseConcMarkSweepGC,即适合Serial和ParNew收集器。

永久区:永久存储区足一个常驻内存区域,用于存放JDK白身所携带的Class , Interface 的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾收器回收掉的,关闭JVM 才会释放此区域所占的内存。若是出现 java.lang.OutOfMemoryError: PermGen space ,说明是 Java 虚拟机的永久代 Perm 内存设置不够。通常出现这种状况,都是程序启动须要加载大量的第三方 jar 包。例如:在一个Tomcat下部署很 多的应用或者大量动态反射生成的类不断被加载,最终致使Perml区被填满。
Jdkl.6及以前:有永久代,常量池在方法区
Jdkl.7:有永久代,但己经逐步“去水久代”,常量池在堆里
Jdkl.8 及以后:无永久代,常量池在元空间blog

2、堆参数调优

默认值:内存

 

参数设置:-Xms10M -Xmx10M -XX:+PrintGCDetails部署

相关文章
相关标签/搜索