我们可以用jvm自带的命令行工具,这里要注意一下要用oracle版本的,不要Linux自带的openjdk.我们敲击jps就能看到Java进程,在用jstat -gc pid 查看垃圾回收进程,上面堆内存分为新生代...这里新生代内存大小和老年代内存大小一般是1:2.其中新生代又分为幸存者0区,幸存者1区,伊甸园区,比例为1:1:8。这个比例也可以条件的。每次新new的对象都会从0区转为1区。在到伊甸园区。...伊甸园区放不下在送到老年代。也就是新生代又百分之90的空间是可以使用的。当然超大对象是不经过新生代,老年代,直接oom的。这里注意一下一般jvm的堆内存是物理机的1/4到1/16。
当有一个新对象产生,需要分配空间; 首先会判断伊甸园区是否有内存空间,如果有内存空间,则直接将新对象保存在伊甸园区; 如果伊甸园区内存空间不足,会自动执行Minor GC操作,将伊甸园区无用的内存空间进行清理...;清理之后会判断伊甸园区的内存空间是否充足?...如果内存空间充足则将新的对象在伊甸园区进行分配; 如果执行了Minor GC操作,发现伊甸园区内存依然不足,那么会判断存活区,如果存活区有内存空间,那么会把伊甸园区的部分活跃对象保存到存活区,随后继续判断伊甸园区的空间是否充足...,如果充足,则在伊甸园区进行新对象内存空间的分配; 如果此时存活区也已没有内存空间,那么判断老年区,如果此时老年区空间充足,则将存活区中的活跃对象保存到老年区,而后存活区就会出现空余空间,而后伊甸园区将活跃对象保存在存活区之中...,而后在伊甸园区中为新对象开辟空间; 如果此时老年代也是满的,此时将产生Major GC(Full GC),进行老年代的内存清理; 如果老年代执行了Full GC之后,发现依然无法实现对象的保存
0.000 0 0.000 0.000 PS C:\> S0C:第一个幸存区的大小 S1C:第二个幸存区的大小 S0U:第一个幸存区的使用大小 S1U:第二个幸存区的使用大小 EC:伊甸园区的大小...EU:伊甸园区的使用大小 OC:老年代大小 OU:老年代使用大小 MC:方法区大小 MU:方法区使用大小 CCSC:压缩类空间大小 CCSU:压缩类空间使用大小 YGC:年轻代垃圾回收次数 YGCT:...EU:伊甸园区的使用大小 YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间 新生代内存统计 gcnewcapacity PS C:\> jstat -gcnewcapacity 6368...EC:当前伊甸园区大小 YGC:年轻代垃圾回收次数 FGC:老年代回收次数 老年代垃圾回收统计 gcold PS C:\> jstat -gcold 6368 MC MU...六、参考 jstat命令查看jvm的GC情况 (以Linux为例) jvm优化必知系列——监控工具 一个java内存泄漏的排查案例 ---- 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
gc pid 垃圾回收统计 [1240] - S0C:第一个幸存区的大小 - S1C:第二个幸存区的大小 - S0U:第一个幸存区的使用大小 - S1U:第二个幸存区的使用大小 - EC:伊甸园区的大小...- EU:伊甸园区的使用大小 - OC:老年代大小 - OU:老年代使用大小 - MC:方法区大小 - MU:方法区使用大小 - CCSC:压缩类空间大小 - CCSU:压缩类空间使用大小...- S0U:第一个幸存区的使用大小 - S1U:第二个幸存区的使用大小 - TT:对象在新生代存活的次数 - MTT:对象在新生代存活的最大次数 - DSS:期望的幸存区大小 - EC:伊甸园区的大小...- EU:伊甸园区的使用大小 - YGC:年轻代垃圾回收次数 - YGCT:年轻代垃圾回收消耗时间 jstat -gccapacity pid 堆内存统计 记忆这个命令可以根据单词组合记忆...EC:当前伊甸园区大小 YGC:年轻代垃圾回收次数 FGC:老年代回收次数 jstat -gcoldcapacity pid 老年代内存空间统计 [1240] OGCMN:老年代最小容量 OGCMX
我们看到年轻代分为伊甸园区,幸存者0区,幸存者1 区。...这时候我们看一下代码中jjvm 的配置 最大对象包括年轻代和老年代=300, 幸存者和伊甸园的比例是1:8, 老年代和年轻代的比例是1:2 由此我们可以得出 伊甸园80 幸存者0:10 幸存者...1:10 老年代:200 从图上伊甸园的格子8X10 我们也能看出和我们的猜想是一样的。...首先伊甸园的格子数值是对象的编号,下面幸存者0 和1区的 格子里面有两个数值,第二个是年龄。也就是被回收一次,年龄加一,超过最大年龄就送到老年代。 默认是15 ,现在是3....一个伊甸园区加上幸存者区, 但是这个需要老年代的分配担保。 要是伊甸园区不够,全部进入老年代就直接引发fullgc .
new的对象先放伊甸园区。此区有大小限制。 当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(MinorGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。...再加载新的对象放到伊甸园区。 然后将伊甸园中的剩余对象移动到幸存者0区。 如果再次触发垃圾回收,此时将伊甸园区和幸存者0区进行垃圾回收,剩下的对象就会放到幸存者1区。...(InterruptedException e) { e.printStackTrace(); } } } } 注意【伊甸园区
J9VMJIT jvm只有一个heap,大小可以调节,默认:实际使用1/64,试图申请内存的1/4(最大内存), -Xms1024m -Xmx1024m 堆内存细分 新生代 8:1:1----》伊甸园...垃圾回收都在伊甸园,老生区 伊甸园满了---》对伊甸园轻GC--->进入幸存区----》也满了---》对伊甸园,幸存区重GC-----》进入养老区---》又满了----》OOM 但进入老生区对象很少...dump 添加启动参数 -XX:+HeapDumpOnOutOfMemoryError GC算法 引用计数法,循环引用无法解决(不常使用) 复制算法(浪费一个幸存区,复制比较费时,存活度较低时常用) 伊甸园满了...-》轻GC---》到幸存区0(随机选一个) 伊甸园又满了---》轻GC--》存回对象会放到幸存区1,且就会把幸存区0的复制到幸存1,幸存0变为空 再此GC时,存活对象--》0,幸存1也复制到0 经历了15
失败类型 FailedMethod: 失败的方法 垃圾回收统计 S0C: 第一个幸存区的大小 S1C: 第二个幸存区的大小 S0U: 第一个幸存区的使用大小 S1U: 第二个幸存区的使用大小 EC: 伊甸园区的大小...EU: 伊甸园区的使用大小 OC: 老年代大小 OU: 老年代使用大小 MC: 方法区大小 MU: 方法区使用大小 CCSC: 压缩类空间大小 CCSU: 压缩类空间使用大小 YGC: 年轻代垃圾回收次数...S1C: 第二个幸存区的大小 S0U: 第一个幸存区的使用大小 S1U: 第二个幸存区的使用大小 TT: 对象在新生代存活的次数 MTT: 对象在新生代存活的最大次数 DSS: 期望的幸存区大小 EC: 伊甸园区的大小...EU: 伊甸园区的使用大小 YGC: 年轻代垃圾回收次数 YGCT: 年轻代垃圾回收消耗时间 新生代内存统计 NGCMN: 新生代最小容量 NGCMX: 新生代最大容量 NGC: 当前新生代容量 S0CMX...: 最大幸存1区大小 S0C: 当前幸存1区大小 S1CMX: 最大幸存2区大小 S1C: 当前幸存2区大小 ECMX: 最大伊甸园区大小 EC: 当前伊甸园区大小 YGC: 年轻代垃圾回收次数 FGC
S0:幸存1区当前使用比例 S1:幸存2区当前使用比例 E:伊甸园区使用比例 O:老年代使用比例 M:元数据区使用比例 CCS:压缩使用比例 YGC:年轻代垃圾回收次数 FGC:老年代垃圾回收次数 FGCT...S0C:第一个幸存区的大小 S1C:第二个幸存区的大小 S0U:第一个幸存区的使用大小 S1U:第二个幸存区的使用大小 EC:伊甸园区的大小 EU:伊甸园区的使用大小 OC:老年代大小 OU:老年代使用大小...NGCMN:新生代最小容量 NGCMX:新生代最大容量 NGC:当前新生代容量 S0C:第一个幸存区大小 S1C:第二个幸存区的大小 EC:伊甸园区的大小 OGCMN:老年代最小容量 OGCMX:老年代最大容量...EU:伊甸园区的使用大小 YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间 新生代内存统计 ?...EC:当前伊甸园区大小 YGC:年轻代垃圾回收次数 FGC:老年代回收次数 老年代垃圾回收统计 ?
新生区又分为两部分:伊甸园区(Eden space)和幸存者区(Survivor space)。所有的类都是在伊甸园区被new出来的。...当伊甸园区的空间用完时候,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC,也叫轻GC 或者是YGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。...然后伊甸园中的剩余对象移动到幸存0区(也叫from区)。若幸存0区也满了,再对该地区进行垃圾回收,然后移动到1区(也叫to区)。 如果1区也满了怎么办呢?
打印出指定线程id=20220的gc 每隔250毫秒打印一次,总共打印10次 S0C 第一个幸存区的大小 S1C 第二个幸存区的大小 S0U 第一个幸存区的使用大小 S1U 第二个幸存区的使用大小 EC 伊甸园区的大小...EU 伊甸园区的使用大小 OC 老年代大小 OU 老年代使用大小 MC 方法区大小 MU 方法区使用大小 CCSC 压缩类空间大小 CCSU 压缩类空间使用大小 YGC 年轻代垃圾回收次数 YGCT...堆内存统计 jstat -gccapacity 20220 NGCMN 新生代最小容量 NGCMX 新生代最大容量 NGC 当前新生代容量 S0C 第一个幸存区大小 S1C 第二个幸存区的大小 EC 伊甸园区的大小...EU 伊甸园区的使用大小 YGC 年轻代垃圾回收次数 YGCT 年轻代垃圾回收消耗时间 关注最大最小新生代空间 jstat -gcnewcapacity 20220 NGCMN 新生代最小容量 NGCMX...新生代最大容量 NGC 当前新生代容量 S0CMX 最大幸存1区大小 S0C 当前幸存1区大小 S1CMX 最大幸存2区大小 S1C 当前幸存2区大小 ECMX 最大伊甸园区大小 EC 当前伊甸园区大小
优点:不会产生碎片 缺点:占用双倍的内存空间 三、 分代垃圾回收机制 创建新的对象时,默认采用伊甸园的内存 当伊甸园内存不足时,会发生Minor GC,对伊甸园进行一次垃圾回收,并采用复制算法将对象存放在幸存区...to,年龄+1(to和from会交换位置) 经过第一次垃圾回收之后,伊甸园的内存又充足了,当伊甸园内存再次不足时会发生第二次Minor GC,此时会对伊甸园和幸存区from进行垃圾回收,也会将存活的对象存放到...参数二:采用自适应调整伊甸园,晋升阈值和幸存区大小。
0.0B->2048.0K Heap:12.6M(252.0M)->7848.3K(252.0M)] — 这里显示了堆的大小变化: Eden: 12.0M(12.0M)->0.0B(14.0M) — 表示伊甸园...在 GC 发生之后,年轻代(young generation)空间下降到0,伊甸园的空间增长到 14mb,但是没有提交。因为要求,额外的空间被添加给伊甸园。...Metaspace: 2776K->2776K(1056768K)] – 这里显示了堆的大小变化,由于这是 Full GC 事件: Eden: 3072.0K(194.0M)->0.0B(201.0M) - 表示伊甸园空间...伊甸园空间增长到201mb,但是没有提交。因为要求,额外的空间被添加给伊甸园。 Survivors: 0.0B->0.0B – 表示 GC 发生前后,幸存者空间是 0kb。
我们将新生代分为三个部分:伊甸园区和两个 survivor 区。 伊甸园区,即对象诞生的地方,存放所有新生的对象,与在西方中我们人类诞生的地方——伊甸园想对应。...4.5、 Copying(拷贝)算法在年轻代中的具体应用 第一次垃圾回收:首先将 10% 的幸存对象拷贝到第一个 survivor 中,即 s0 中,然后将整个伊甸园区进行清除。...如下图所示: 第二次垃圾回收:将伊甸园区中有用的对象拷贝到另一个 survivor 中,即 s1 中,再将之前 s0 中的对象(前提是有用)拷贝到 s1 中,对伊甸园区与第一个 s0 进行垃圾回收。...如下图所示: 第三次垃圾回收:再次利用 s0,将之前存活的对象与伊甸园区中产生的新对象存放在 s0 中,对伊甸园区与 s1 进行二垃圾回收。...如下图所示: 第 n 次垃圾回收:如此循环往复利用新生代中的伊甸园区与 survivor 区即可。
我们将新生代分为三个部分:伊甸园区和两个 survivor 区。 伊甸园区,即对象诞生的地方,存放所有新生的对象,与在西方中我们人类诞生的地方——伊甸园想对应。...4.5、 Copying(拷贝)算法在年轻代中的具体应用 第一次垃圾回收:首先将 10% 的幸存对象拷贝到第一个 survivor 中,即 s0 中,然后将整个伊甸园区进行清除。...如下图所示: 第二次垃圾回收:将伊甸园区中有用的对象拷贝到另一个 survivor 中,即 s1 中,再将之前 s0 中的对象(前提是有用)拷贝到 s1 中,对伊甸园区与第一个 s0 进行垃圾回收...如下图所示: 第三次垃圾回收:再次利用 s0,将之前存活的对象与伊甸园区中产生的新对象存放在 s0 中,对伊甸园区与 s1 进行二垃圾回收。...如下图所示: 第 n 次垃圾回收:如此循环往复利用新生代中的伊甸园区与 survivor 区即可。
详细过程是: 新生代的伊甸园区对象如果满了,就会触发 YGC,YGC 后还存活的对象,就会进入 from 区,同时清空伊甸园区; 伊甸园区经过一次 YGC 又满了时,会再次触发 YGC,会对伊甸园区和...from 区都进行垃圾回收; 经过这里两次 YGC 还存活的对象,就会复制到 to 区,对象年龄加一,然后清空伊甸园区和 from 区,此时 from 区和 to 区身份互换,谁空谁是 to; 当对象年龄达到阈值
亚当和夏娃的故事 据传说,亚当是上帝创世第六天,根据自己的模样造出的第一个人,让亚当生活在伊甸园中,由于资源非常丰富,人闲就会是非多,终于有一天亚当感觉实在太TM寂寞了,于是央求上帝在造个人出来,上帝由于太过疼爱亚当...亚当和夏娃非常的恩爱,但是不论在什么的样的场景下,所有的自由都是收到约束的,比如上帝就不允许他们去吃伊甸园里面的两颗苹果树上的苹果!...但是需求总是变化的,伊甸园生活的一挑毒蛇sadan,诱惑夏娃说这两棵苹果树分别是智慧之树和生命之树,吃了可以和上帝一样聪明和长寿。
下同 堆内存,按比例设置 解释: -XX:NewRatio=2:1 表示老年代占两份,新生代占一份 -XX:SurvivorRatio=4:1 表示新生代分成六份,伊甸园占四份,from 和 to 各占一份...eden,最初对象都分配到这里,与幸存区 survivor(分成 from 和 to)合称新生代, 当伊甸园内存不足,标记伊甸园与 from(现阶段没有)的存活对象 将存活对象采用复制算法复制到...to 中,复制完毕后,伊甸园和 from 内存都得到释放 将 from 和 to 交换位置 经过一段时间后伊甸园的内存又出现不足 标记伊甸园与 from(现阶段没有)的存活对象 将存活对象采用复制算法复制到...当伊甸园需要垃圾回收时,挑出一个空闲区域作为幸存区,用复制算法复制存活对象,需要暂停用户线程 复制完成,将之前的伊甸园内存释放 随着时间流逝,伊甸园的内存又有不足 将伊甸园以及之前幸存区中的存活对象...混合收集阶段中,参与复制的有 eden、survivor、old,下图显示了伊甸园和幸存区的存活对象复制 下图显示了老年代和幸存区晋升的存活对象的复制 复制完成,内存得到释放。
开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux...新生代(Young generation)用来保存那些第一次被创建的对象,它被分成三个空间: 一个伊甸园空间(Eden) 两个幸存者空间(From Survivor、To Survivor) 默认新生代空间的分配...:Eden : From : To =8 : 1 : 1 每个空间的执行说明如下: 绝大多数刚刚被创建的对象会存放在伊甸园空间(Eden)。...绝大多数刚刚被创建的对象会存放在伊甸园空间(Eden)。 在伊甸园空间执行第一次GC(Minor GC)之后,存活的对象被移动到其中一个幸存者空间(Survivor)。...此后,每次伊甸园空间执行GC后,存活的对象会被堆积在同一个幸存者空间。 当一个幸存者空间饱和,还在存活的对象会被移动到另一个幸存者空间。
:MaxNewSize-size ) 幸存区比例(动态) -XX:InitialSurvivorRatio-ratio和-XX:+UseAdaptiveSizePolicy 幸存区比例(ratio是指伊甸园所在比例...这里看下新生代,我们可以发现内存分为了伊甸园与幸存区俩部分,幸存区又被分为了两部分,可以认为我们上诉提到的from和to。...这里一旦伊甸园存满了,就需要进行清理,我们称之为Minor GC,清理过程就是上诉的标记-复制过程,而后我们将伊甸园中幸存的对象移入到幸存区中,然后直接清理伊甸园即可。...在之后伊甸园又满了,我们这时不仅仅要对伊甸园对象进行处理,也要对幸存区中存有数据的那一块进行处理,将二者之中幸存的对象移入到幸存区的另一块中,然后交换二者的角色(即交换from与to的角色)。
领取专属 10元无门槛券
手把手带您无忧上云