标签:这一 时间 直接 hotspot 永久 new 容量 计数 out
新生代和老年代的 GC 操作
- 新生代 GC 操作:Minor GC
- 发生的非常频繁,速度较块。
- 老年代 GC 操作:Full GC / Major GC
- 经常伴随着至少一次的 Minor GC;
- 速度一般比 Minor GC 慢上 10 倍以上。
-Xmx
:Java 堆的最大值;-Xms
:Java 堆的最小值;-Xmn
:新生代大小;-XX:SurvivorRatio=8
:Eden 区 / Survivor 区 = 8 : 1-XX:PretenureSizeThreshold
:单位是字节;
-XX:MaxTenuringThreshold
设定值后,会被晋升到老年代,-XX:MaxTenuringThreshold
默认为 15;我们知道,新生代采用的是复制算法清理内存,每一次 Minor GC,虚拟机会将 Eden 区和其中一块 Survivor 区的存活对象复制到另一块 Survivor 区,但 当出现大量对象在一次 Minor GC 后仍然存活的情况时,Survivor 区可能容纳不下这么多对象,此时,就需要老年代进行分配担保,即将 Survivor 无法容纳的对象直接进入老年代。
这么做有一个前提,就是老年代得装得下这么多对象。可是在一次 GC 操作前,虚拟机并不知道到底会有多少对象存活,所以空间分配担保有这样一个判断流程:
Java 8 彻底将永久代 (PermGen) 移除出了 HotSpot JVM,将其原有的数据迁移至 Java Heap 或 Metaspace。
移除 PermGen 的原因:
移除 PermGen 后,方法区和字符串常量的位置:
Metaspace 的位置: 本地堆内存(native heap)。
Metaspace 的优点: 永久代 OOM 问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上 Metaspace 就可以有多大;
JVM参数:
-XX:MetaspaceSize
:分配给类元数据空间(以字节计)的初始大小,为估计值。MetaspaceSize的值设置的过大会延长垃圾回收时间。垃圾回收过后,引起下一次垃圾回收的类元数据空间的大小可能会变大。-XX:MaxMetaspaceSize
:分配给类元数据空间的最大值,超过此值就会触发Full GC,取决于系统内存的大小。JVM会动态地改变此值。-XX:MinMetaspaceFreeRatio
:一次GC以后,为了避免增加元数据空间的大小,空闲的类元数据的容量的最小比例,不够就会导致垃圾回收。-XX:MaxMetaspaceFreeRatio
:一次GC以后,为了避免增加元数据空间的大小,空闲的类元数据的容量的最大比例,不够就会导致垃圾回收。标签:这一 时间 直接 hotspot 永久 new 容量 计数 out
原文地址:https://www.cnblogs.com/mengY/p/12254051.html