JVM GC一个对象的朝生夕死

简介:  一,假如活在一个没有分代的连续内存中   假设程序占用的内存是从0000~FFFF这个地址,现在程序执行到给一个对象分配内存的那部分代码,给这个对象分配了2345~2346这段内存,程序继续执行,到了某一个时刻,程序分配的内存地址用完了,这时候,程序要回收这段地址里面,已经无用的对象...



 一,假如活在一个没有分代的连续内存中


   假设程序占用的内存是从0000~FFFF这个地址,现在程序执行到给一个对象分配内存的那部分代码,给这个对象分配了2345~2346这段内存,程序继续执行,到了某一个时刻,程序分配的内存地址用完了,这时候,程序要回收这段地址里面,已经无用的对象,那么,它首先要从头到尾扫描一遍,然后把其中没用的地址空间找到,之后将对象占用地址的起始位置和终止位置进行一个向上或者向下的移动,将不连续的地址变成连续的地址空间,打扫房间结束,程序继续分配内存执行程序;在一整块连续的内存中,进行所有对象的分配,方式是比较简单的,但是就是每次都要从头到尾的扫描一遍,如果程序占用的内存非常大,或者程序需要对外部响应非常及时,这时候,就会出现很大的问题了。


二,two part


     将可用内存分为:常回收内存部分+不常回收部分。按照对象是否经常被回收进行分配内存。对象创建之后,先放入常常进行垃圾回收的内存空间中,如果好久不释放,再放入不常回收的部分。需要制定一个标准或者规则,来定义多久对象从常回收部分移动到不常被回收的部分。

    这部分主要是为了说明为什么要分代回收。


三,s0,s1 Eden部分


   这三部分都属于新生代,对象被创建之后,首先放入Eden中,经过一次Minor GC,被放入From Survivor,再次Minor GC,想象你此时身处From Survivor中,你身边有着经历过16此Minor GC还活着的老对象,它们被移动到了老年代中,还有像你似的,只经历过一两次的,你们一起被复制到了To Survivor中,最后,From Survivor空了,Eden也空了,之后,To Survivor连续整齐的排列着熬下来还属于青年的新生代对象,From Survivor与To进行交换,此时,你又回到了From survivor中,静静地等着下一个时钟周期的到来。。


四,s部分作用

   如果没有s部分,每次新创建的对象,先被放到Eden,满了之后,放到老年代,老年代满了,full gc,你会发现,full gc其实是很频繁的,为了不经常对老年代进行回收,就要把年轻代里面对象的回收,做的过程久一点,放入到老年代的条件严格一点儿,所以加入一个中间缓冲带S。

五,s0与s1

     试想如果仅有s,在某个对新生代回收的时刻,这时候,在Eden与S部分,都有不连续的内存空间,合并之后,空间还是不连续的,有时候可能会出现这种情况,给一个对象分配空间,总的剩余容量是足够的,但是没有连续的空间可以达到对象的大小,这就尴尬了。所以,为了减少这种碎碎念的出现,s拆分为s0,s1,两部分采用复制算法进行对象交换,保证了在某个时刻,一个s是空的,另一个空间是连续的。






  

目录
相关文章
|
3月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
214 3
|
3月前
|
监控 Java 测试技术
JVM 性能调优 及 为什么要减少 Full GC
JVM 性能调优 及 为什么要减少 Full GC
94 4
|
3月前
|
存储 算法 安全
(八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析
在《GC分代篇》中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析。
121 12
|
3月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
3月前
|
算法 安全 Java
(七)JVM成神路之GC分代篇:分代GC器、CMS收集器及YoungGC、FullGC日志剖析
在《GC基础篇》中曾谈到过分代以及分区回收的概念,但基础篇更多的是建立在GC的一些算法理论上进行高谈阔论,而本篇则重点会对于分代收集器的实现进行全面详解,其中会涵盖串行收集器、并行收集器、三色标记、SATB算法、GC执行过程、并发标记、CMS收集器等知识,本篇则偏重于分析GC机制的落地实现,也就是垃圾收集器(Garbage Collector)。
|
3月前
|
存储 监控 算法
(六)JVM成神路之GC基础篇:对象存活判定算法、GC算法、STW、GC种类详解
经过前面五个章节的分析后,对于JVM的大部分子系统都已阐述完毕,在本文中则开始对JVM的GC子系统进行全面阐述,GC机制也是JVM的重中之重,调优、监控、面试都逃不开的JVM话题。
|
3月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
|
2月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
|
2月前
|
存储 监控 算法
深入解析JVM内部结构及GC机制的实战应用
深入解析JVM内部结构及GC机制的实战应用
|
3月前
|
人工智能 Java
JVM内存问题之当老年代缓慢增加且Full GC无法清除时,应如何使用MAT进行分析
JVM内存问题之当老年代缓慢增加且Full GC无法清除时,应如何使用MAT进行分析
116 0