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是空的,另一个空间是连续的。






  

目录
相关文章
|
19天前
|
存储 算法 Java
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
29 1
散列表的数据结构以及对象在JVM堆中的存储过程
|
4月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
450 3
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
69 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
23天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
47 3
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
57 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
1月前
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。
|
1月前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
61 0
|
3月前
|
存储 Java 程序员
Java中对象几种类型的内存分配(JVM对象储存机制)
Java中对象几种类型的内存分配(JVM对象储存机制)
86 5
Java中对象几种类型的内存分配(JVM对象储存机制)