首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏山海散人技术

    004. 深入JVM学习—Java垃圾回收流程

    当有一个新对象产生,需要分配空间; 首先会判断伊甸园区是否有内存空间,如果有内存空间,则直接将新对象保存在伊甸园区; 如果伊甸园区内存空间不足,会自动执行Minor GC操作,将伊甸园区无用的内存空间进行清理 ;清理之后会判断伊甸园区的内存空间是否充足? 如果内存空间充足则将新的对象在伊甸园区进行分配; 如果执行了Minor GC操作,发现伊甸园区内存依然不足,那么会判断存活区,如果存活区有内存空间,那么会把伊甸园区的部分活跃对象保存到存活区,随后继续判断伊甸园区的空间是否充足 ,如果充足,则在伊甸园区进行新对象内存空间的分配; 如果此时存活区也已没有内存空间,那么判断老年区,如果此时老年区空间充足,则将存活区中的活跃对象保存到老年区,而后存活区就会出现空余空间,而后伊甸园区将活跃对象保存在存活区之中 ,而后在伊甸园区中为新对象开辟空间; 如果此时老年代也是满的,此时将产生Major GC(Full GC),进行老年代的内存清理; 如果老年代执行了Full GC之后,发现依然无法实现对象的保存

    56310发布于 2021-03-03
  • 来自专栏blog-技术博客

    JVM进阶

    StackflowError,一般是200层 堆 JVM分类 sun 热点虚拟机 jrockit,最快的jvm IBM,J9VMJIT jvm只有一个heap,大小可以调节,默认:实际使用1/64,试图申请内存的1/4( 最大内存), -Xms1024m -Xmx1024m 堆内存细分 新生代 8:1:1----》伊甸园,幸存区0,幸存区1 老生区 永久区 1.6 :永久代,常量池在方发区 1.7:永久代, 垃圾回收都在伊甸园,老生区 伊甸园满了---》对伊甸园轻GC--->进入幸存区----》也满了---》对伊甸园,幸存区重GC-----》进入养老区---》又满了----》OOM 但进入老生区对象很少 dump 添加启动参数 -XX:+HeapDumpOnOutOfMemoryError GC算法 引用计数法,循环引用无法解决(不常使用) 复制算法(浪费一个幸存区,复制比较费时,存活度较低时常用) 伊甸园满了 -》轻GC---》到幸存区0(随机选一个) 伊甸园又满了---》轻GC--》存回对象会放到幸存区1,且就会把幸存区0的复制到幸存1,幸存0变为空 再此GC时,存活对象--》0,幸存1也复制到0 经历了15

    49121发布于 2020-09-18
  • 来自专栏九州牧云

    浅谈 G1 GC 日志格式

    4、GC Workers: 8 – 表示 GC 的工作线程是 8 个。 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,但是没有提交。因为要求,额外的空间被添加给伊甸园伊甸园空间增长到201mb,但是没有提交。因为要求,额外的空间被添加给伊甸园。 Survivors: 0.0B->0.0B – 表示 GC 发生前后,幸存者空间是 0kb。 4、Times: user=19.08, sys=0.01, real=9.74 secs – real 表示 GC 总共花了 9.74 秒,这个停顿时间很长。

    3.1K40发布于 2019-08-21
  • 来自专栏java闲聊

    Jstat命令详解-1.8

    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

    2.7K30发布于 2018-07-13
  • 来自专栏分享干货的你

    jvm 教程动画版

    我们看到年轻代分为伊甸园区,幸存者0区,幸存者1 区。 这时候我们看一下代码中jjvm 的配置 最大对象包括年轻代和老年代=300, 幸存者和伊甸园的比例是1:8, 老年代和年轻代的比例是1:2 由此我们可以得出 伊甸园80 幸存者0:10 幸存者 1:10 老年代:200 从图上伊甸园的格子8X10 我们也能看出和我们的猜想是一样的。 首先伊甸园的格子数值是对象的编号,下面幸存者0 和1区的 格子里面有两个数值,第二个是年龄。也就是被回收一次,年龄加一,超过最大年龄就送到老年代。 默认是15 ,现在是3. 一个伊甸园区加上幸存者区, 但是这个需要老年代的分配担保。 要是伊甸园区不够,全部进入老年代就直接引发fullgc .

    40520编辑于 2022-09-22
  • 来自专栏小勇DW3

    服务器端使用jstat定位GC问题的有关命令

    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:老年代回收次数   老年代垃圾回收统计 ?

    1.4K30发布于 2018-09-29
  • 来自专栏猫头虎博客专区

    jstat命令查看jvm的GC情况 (以Linux为例)

    失败类型 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

    2.4K10编辑于 2024-04-07
  • 来自专栏Utopia

    图解对象分配过程

    new的对象先放伊甸园区。此区有大小限制。 当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(MinorGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。 再加载新的对象放到伊甸园区。 然后将伊甸园中的剩余对象移动到幸存者0区。 如果再次触发垃圾回收,此时将伊甸园区和幸存者0区进行垃圾回收,剩下的对象就会放到幸存者1区。 (InterruptedException e) { e.printStackTrace(); } } } } 注意【伊甸园

    42830编辑于 2023-03-21
  • 来自专栏博客分享

    JVM学习-垃圾回收

    优点:不会产生碎片 缺点:占用双倍的内存空间 三、 分代垃圾回收机制 创建新的对象时,默认采用伊甸园的内存 当伊甸园内存不足时,会发生Minor GC,对伊甸园进行一次垃圾回收,并采用复制算法将对象存放在幸存区 to,年龄+1(to和from会交换位置) 经过第一次垃圾回收之后,伊甸园的内存又充足了,当伊甸园内存再次不足时会发生第二次Minor GC,此时会对伊甸园和幸存区from进行垃圾回收,也会将存活的对象存放到 存活的对象不会一直在幸存区,当年龄超过一定的阈值(最大为15,因为是4bit,最大为1111)会认为该对象价值高经常被使用,会晋升至老年代。 参数二:采用自适应调整伊甸园,晋升阈值和幸存区大小。

    40220编辑于 2022-11-10
  • 来自专栏java学习java

    jvm之堆解读

    默认情况下 初始内存大小:物理电脑内存大小 / 64 最大内存大小:物理电脑内存大小 / 4 OutOfMemory举例  public class OOMTest { public static 默认-XX:NewRatio=2,表示新生代占1,老年代占2,新生代占整个堆的1/3 可以修改-XX:NewRatio=4,表示新生代占1,老年代占4,新生代占整个堆的1/5 在HotSpot中,Eden A.new的对象先放伊甸园区。此区有大小限制。 B.当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(MinorGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。 再加载新的对象放到伊甸园区 C.然后将伊甸园中的剩余对象移动到幸存者0区。 D.如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,就会放到幸存者1区。

    45720编辑于 2023-10-15
  • 来自专栏凯哥Java

    JVM笔记五-堆区

    新生区又分为两部分:伊甸园区(Eden space)和幸存者区(Survivor space)。所有的类都是在伊甸园区被new出来的。 当伊甸园区的空间用完时候,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC,也叫轻GC 或者是YGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。 然后伊甸园中的剩余对象移动到幸存0区(也叫from区)。若幸存0区也满了,再对该地区进行垃圾回收,然后移动到1区(也叫to区)。 如果1区也满了怎么办呢?

    63533发布于 2020-10-11
  • 来自专栏博客分享

    面试专题-虚拟机篇

    下同 堆内存,按比例设置 解释: -XX:NewRatio=2:1 表示老年代占两份,新生代占一份 -XX:SurvivorRatio=4:1 表示新生代分成六份,伊甸园占四份,from 和 to 各占一份 to 中,复制完毕后,伊甸园和 from 内存都得到释放 将 from 和 to 交换位置 经过一段时间后伊甸园的内存又出现不足 标记伊甸园与 from(现阶段没有)的存活对象 将存活对象采用复制算法复制到 例如: 如图所示标记工作尚未完成 用户线程同时在工作,断开了第一层 3、4 两个对象之间的引用,这时对于正在处理 3 号对象的垃圾回收线程来讲,它会将 4 号对象当做是白色垃圾 但如果其他用户线程又建立了 当伊甸园需要垃圾回收时,挑出一个空闲区域作为幸存区,用复制算法复制存活对象,需要暂停用户线程 复制完成,将之前的伊甸园内存释放 随着时间流逝,伊甸园的内存又有不足 将伊甸园以及之前幸存区中的存活对象 进入下一轮的新生代回收、并发标记、混合收集 4.

    56920编辑于 2022-11-10
  • 来自专栏技术趋势

    JVM-jstat(虚拟机统计信息监视工具)的使用

    打印出指定线程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 当前伊甸园区大小

    77620发布于 2021-09-17
  • 来自专栏分享干货的你

    浅谈jvm的垃圾回收

    这里新生代内存大小和老年代内存大小一般是1:2.其中新生代又分为幸存者0区,幸存者1区,伊甸园区,比例为1:1:8。这个比例也可以条件的。每次新new的对象都会从0区转为1区。在到伊甸园区。 伊甸园区放不下在送到老年代。也就是新生代又百分之90的空间是可以使用的。当然超大对象是不经过新生代,老年代,直接oom的。这里注意一下一般jvm的堆内存是物理机的1/4到1/16。

    53940发布于 2021-04-07
  • 来自专栏JavaEE

    java面试题 --- JVM之垃圾回收

    4. 哪些对象可以当作 GC Roots? 系统类对象,也就是 jdk 自带的类的对象; native 方法引用的对象; 活动线程正在引用的对象; 正用于加锁的锁对象。 5. 详细过程是: 新生代的伊甸园区对象如果满了,就会触发 YGC,YGC 后还存活的对象,就会进入 from 区,同时清空伊甸园区; 伊甸园区经过一次 YGC 又满了时,会再次触发 YGC,会对伊甸园区和 from 区都进行垃圾回收; 经过这里两次 YGC 还存活的对象,就会复制到 to 区,对象年龄加一,然后清空伊甸园区和 from 区,此时 from 区和 to 区身份互换,谁空谁是 to; 当对象年龄达到阈值

    44810编辑于 2022-03-09
  • 来自专栏Redis

    【 java 虚拟机知识 第一篇 】

    ,而幸存者区又平均分为S0和S1区,伊甸园区与S0与S1之间的比例:8:1:1,每次新创建的对象实例都会先存入伊甸园区,它们主要使用的垃圾回收算法是复制算法,当伊甸园区的内存使用完时,会使用可达性分析算法 GC过程就会给对象年龄加一,直到大于等于15时,会认为该对象生命周期长,移入老年代中 细节:其实新创建的对象不会直接存入伊甸园区,如果多线程情况下同时进行存入对象(线程竞争压力大)会导致性能的损失,因此会给每个线程从伊甸园区中先申请一块 它会将数据复制一份重新创建一个新的对象存入池中,jdk1.7会将其地址复用给池中 String s2 = new("b");同理 String s3 = "a" + "b";常量进行相加,与new("ab")基本一致 String s4 创建软引用并关联队列 SoftReference<Object> softRef = new SoftReference<>(data, queue); // 4. System.out.println(" queue.poll() = " + queue.poll()); // null // 4.

    24910编辑于 2025-06-10
  • 来自专栏java一日一条

    成为JavaGC专家(1)—深入浅出Java垃圾回收机制

    每个空间的执行顺序如下: 绝大多数刚刚被创建的对象会存放在伊甸园空间。 在伊甸园空间执行了第一次GC之后,存活的对象被移动到其中一个幸存者空间。 Bump-the-pointer技术跟踪在伊甸园空间创建的最后一个对象。这个对象会被放在伊甸园空间的顶部。如果之后再需要创建对象,只需要检查伊甸园空间是否有足够的剩余空间。 不知道他们不会对你产生什么影响,但是请务必记住在对象刚刚被创建之后,是保存在伊甸园空间的。那些长期存活的对象会经由幸存者空间转存在老年代空间。 图 4: Serial GC 与 Parallel GC的区别 从上图中,你可以轻易地看出serial GC和parallel GC的区别,serial GC只使用一个线程执行GC,而parallel 4. CMS GC (-XX:+UseConcMarkSweepGC) ? 图 5: Serial GC & CMS GC 就像你从上图看到的那样, CMS GC比我之前解释的各种算法都要复杂很多。

    63320发布于 2018-09-18
  • 来自专栏全栈程序员必看

    jstat命令详解[通俗易懂]

    (幸存区)的容量 (字节) S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) EC 年轻代中Eden(伊甸园 )的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) OC Old代的容量 (字节) OU Old代目前已使用空间 (字节) PC Perm(持久代)的容量 (字节) PU Perm gc所用时间(s) FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s) 4、 年轻代(young)中当前的容量 (字节) S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) EC 年轻代中Eden(伊甸园 )的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s) 7、jstat

    4.1K40编辑于 2022-10-01
  • 来自专栏九州牧云

    Java命令学习系列(四)——jstat

    (幸存区)的容量 (字节) S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) EC 年轻代中Eden(伊甸园 )的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) OC Old代的容量 (字节) OU Old代目前已使用空间 (字节) PC Perm(持久代)的容量 (字节) PU Perm 所用时间(s) FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s) 4、 年轻代(young)中当前的容量 (字节) S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) EC 年轻代中Eden(伊甸园 )的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s) 7、jstat

    63030发布于 2019-08-21
  • 来自专栏开源君

    JVM之堆

    1、对象分配过程 new的对象先放伊甸园区。此区有大小限制。 当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。 将伊甸园中的剩余对象移动到幸存者0区。 然后加载新的对象放到伊甸园区 ? 如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,就会放到幸存者1区。 ? 说明: - 伊甸园区的分配如图所示,当分配的对象到达150M,则进行一次垃圾回收,将非垃圾放入幸存者1区,继续分配放入伊甸园区,到达150之后,将对象放入0区,并且将之前1区中的对象放入老年区,以此类推 4、逃逸分析小结(技术并不成熟) 关于逃逸分析的论文在1999年就已经发表了,但直到JDK1.6才有实现,而且这项技术到如今也并不是十分成熟的。

    1.1K40发布于 2021-06-29
领券