做网站 业务流程图超融合系统
news/
2025/9/24 1:42:12/
文章来源:
做网站 业务流程图,超融合系统,做网站的软件叫code,seo快速排名软件品牌Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。 1. 新生代
是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象#xff0c;所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、…Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。 1. 新生代
是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、ServivorTo 三个区。
1.1 Eden 区
Java 新对象的出生地如果新创建的对象占用内存很大则直接分配到老年代。当 Eden 区内存不够的时候就会触发 MinorGC对新生代区进行一次垃圾回收。
1.2 ServivorFrom
上一次 GC 的幸存者作为这一次 GC 的被扫描者。
1.3 ServivorTo
保留了一次 MinorGC 过程中的幸存者。
1.4 MinorGC 的过程复制-清空-互换
MinorGC 采用复制算法。
eden、servicorFrom复制到 ServicorTo年龄1
首先把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域如果有对象的年龄以及达到了老年的标准则赋值到老年代区同时把这些对象的年龄1如果 ServicorTo 不够位置了就放到老年区
清空 eden、servicorFrom
然后清空 Eden 和 ServicorFrom 中的对象
ServicorTo 和 ServicorFrom 互换
最后ServicorTo 和 ServicorFrom 互换原 ServicorTo 成为下一次 GC 时的 ServicorFrom区。
2. 老年代
主要存放应用程序中生命周期长的内存对象。
老年代的对象比较稳定所以 MajorGC 不会频繁执行。在进行 MajorGC 前一般都先进行了一次 MinorGC使得有新生代的对象晋身入老年代导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次 MajorGC 进行垃圾回收腾出空间。
MajorGC 采用标记清除算法首先扫描一次所有老年代标记出存活的对象然后回收没有标记的对象。MajorGC 的耗时比较长因为要扫描再回收。MajorGC 会产生内存碎片为了减少内存损耗我们一般需要进行合并或者标记出来方便下次直接分配。当老年代也满了装不下的时候就会抛出 OOMOut of Memory异常。
3. 永久代
指内存的永久保存区域主要存放 Class 和 Meta元数据的信息,Class 在被加载的时候被放入永久区域它和和存放实例的区域不同,GC 不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的 Class 的增多而胀满最终抛出 OOM 异常。
3.1. JAVA8 与元数据
在 Java8 中永久代已经被移除被一个称为“元数据区”元空间的区域所取代。元空间的本质和永久代类似元空间与永久代之间最大的区别在于元空间并不在虚拟机中而是使用本地内存。因此默认情况下元空间的大小仅受本地内存限制。类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中这样可以加载多少类的元数据就不再由MaxPermSize 控制, 而由系统的实际可用空间来控制。
4.Minor GC、Major GC、Full GC是什么
Minor GC是新生代GC指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的所以Minor GC非常频繁一般回收速度也比较快。一般采用复制算法回收垃圾Major GC是老年代GC指的是发生在老年代的GC通常执行Major GC会连着Minor GC一起执行。Major GC的速度要比Minor GC慢的多。可采用标记清楚法和标记整理法Full GC是清理整个堆空间包括年轻代和老年代
5. Minor GC、Major GC、Full GC区别及触发条件 Minor GC 触发条件一般为 1eden区满时触发MinorGC。即申请一个对象时发现eden区不够用则触发一次MinorGC。 2新创建的对象大小 Eden所剩空间时触发Minor GC Major GC和Full GC 触发条件一般为 Major GC通常是跟full GC是等价的 1每次晋升到老年代的对象平均大小老年代剩余空间 2MinorGC后存活的对象超过了老年代剩余空间 3永久代空间不足 4执行System.gc() 5CMS GC异常 6堆内存分配很大的对象
6.为什么新生代要分Eden和两个 Survivor 区域 如果没有SurvivorEden区每进行一次Minor GC存活的对象就会被送到老年代。老年代很快被填满触发Major GC.老年代的内存空间远大于新生代进行一次Full GC消耗的时间比Minor GC长得多,所以需要分为Eden和Survivor。 Survivor的存在意义就是减少被送到老年代的对象进而减少Full GC的发生Survivor的预筛选保证只有经历15次Minor GC还能在新生代中存活的对象才会被送到老年代。 设置两个Survivor区最大的好处就是解决了碎片化刚刚新建的对象在Eden中经历一次Minor GCEden中的存活对象就会被移动到第一块survivor space S0Eden被清空等Eden区再满了就再触发一次Minor GCEden和S0中的存活对象又会被复制送入第二块survivor space S1这个过程非常重要因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间避免了碎片化的发生
7.Java堆老年代( Old ) 和新生代 ( Young ) 的默认比例 默认的新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 )即新生代 ( Young ) 1/3 的堆空间大小。老年代 ( Old ) 2/3 的堆空间大小。 其中新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域Edem 和俩个Survivor 区域比例是 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ) 但是JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务所以无论什么时候总是有一块 Survivor 区域是空闲着的。 jvm相关知识点持续更新中喜欢的话请点赞、收藏、关注哦
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914508.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!