JVM GC时堆内存中新生代的复制算法
来源:互联网 发布:什么是编程范式 编辑:程序博客网 时间:2024/05/29 13:15
JVM GC过程中新生代的复制算法
JVM虚拟机中对内存进行回收主要就是对堆内存的回收,heap区把堆内存分为新生代和旧生代
- 新生代:主要存放新new出来的对象
- 旧生代:在新生代中经过多次回收都没有被回收掉的对象就会放入旧生代,默认16次
1.为什么要划分出新生代和旧生代
在JVM 进行内存回收的时候jvm每次都对所有内存空间做查找回收,显然是很低效的事情,所以JVM将堆内存划分出一块新生代,将新创建的对象都放在里面,内存满了就在新生代中做GC。这样可以提高回收效率。
2.新生代内的区域划分
新生代作为内存回收的重点区域,是被垃圾回收器光顾频率最高的地方,没有两把刷子怎么能做好工作,新生代又分为Eden区和Survivor区,只从名字我们也能看出个123。
- Eden:伊甸园,亚当和夏娃啪啪造人的地方,很明显,新对象肯定放在这里
- Survivor:幸存者区,那些没有被回收掉的对象肯定是放在这里了
当然事情肯定没这么简单…
- Survivor做不做回收,如果不做回收,那它里面的对象岂不是经过一次GC就高枕无忧了,所以回收肯定是要做的
- 如果Survivor做了回收,有的对象被回收掉了,新的对象被加入进来,每个对象所用的空间又不是一样的,这样就会产生内存碎片
…..艹,你想怎么样
所以Survivor区又划分为两个大小一样的部分,FromSpace和ToSpace。
3.新生代内存回收的复制算法
好了,做了那么多铺垫,本文的重点来了!!!
从前面我们知道新生代被分为Enden和Survivor区,而Survivor区又分为两个大小完全一样的部分。
复制回收算法很简单就是两步
1. 把Enden区和Survivor中有内容的那一部分不被回收的对象,复制存入Survivor中没有内容的那一部分
2. 把Enden区和Survivor中的FromSpace清空。一次回收就完成了,此时一开始Survivor中有内容的那一部分变为没有内容的那一部分,没有内容的那一部分变成有内容的那一部分(这一句要好好理解,很多同学因为这一点没想通,一直不太理解。不要问我为什么(┬_┬))
好了,这样就搞定了,还不会存在内存碎片。当下一次GC时重复执行第一步和第二步就可以了。
- JVM GC时堆内存中新生代的复制算法
- JVM的GC机制<一>新生代GC
- JVM的GC机制<一>新生代GC
- JVM架构(009)_什么是新生代的复制算法
- java 虚拟机堆内存划分--新生代与老年代GC
- jvm堆内存分布及gc发生的条件
- JVM的堆和栈以及GC算法的介绍
- JVM gc只新生代串行GC
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
- JVM 的GC算法
- JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?
- 堆内存的GC机制
- JVM内存解析以及GC基本算法
- JVM内存管理------GC算法简介
- JVM内存分区和GC回收算法
- Spring定时任务——注解@Scheduled实现定时任务
- 深度学习中的卷积与反卷积
- 线程
- Xml的schema约束
- CentOS重启ssh服务命令
- JVM GC时堆内存中新生代的复制算法
- Java注解(Annotation)详解(一)——概述及JDK自带注解
- Ajax提交form表单(包括文件上传)
- 使用Pandas对数据进行筛选和排序
- Qt之QTcpServer/QTcpSocket简单收发信息(2)
- struts2_day03_16_ognl表达式#使用_17_ognl表达式%使用
- Leetcode:Hamming Distance一些小结
- Mock.js使用
- 共同学习Java源代码-数据结构-HashMap(十八)