Java垃圾回收之回收算法
问题:谈谈你了解的垃圾回收算法
1、标记-清除算法(Mark and Sweep)
标记:从跟集合进行扫描,对存活的对象进行标记
清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存
优点:简单
缺点:容易出现碎片
这个算法会导致出现大量的不连续的内存碎片,可能会导致在之后的分配较大的对象时,无法找到足够的连续内存,会触发另外一次垃圾回收。上图就出现了三个内存碎片块
2、复制算法(copying 适用于对象存活率低的场景,年轻代)
2.1 分为对象面和空闲面
2.2 对象在对象面上创建
2.3 存活的对象被对象面复制到空闲面
2.4 将对象面所有对象内存清除
优点:
1、解决碎片化问题
2、顺序分配内存,简单高效
3、适用于对象存活率低的场景
缺点:
1、在面对对象回收率高的情况下,就显得力不从心了。要进行较多的复制操作,效率将会变低,
2、更关键的是:如果不想浪费50%的空间,就需要额外的空间进行分配和担保,为应对对象面中对象100%存活的极端情况。
3、标记-整理算法(Compacting,适用于老年代中)
标记:从根集合进行扫描,对存活的对象进行标记
清除:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收
优点:
解决了标记-清除算法导致的碎片化问题(避免了内存的不连续性)
不用设置两块内存互换
适用于存活率高的场景
4、分代收集算法(Generational Collector)
4.1 垃圾回收算法的组合拳
4.2 按照对象生命周期的不同划分区域以采用不同的垃圾回收算法(怎样判断对象的生命周期?)
4.3 目的:提高JVM的回收效率
(三个模块,年轻代,老年代,永久代)
-------------------------------------------
(永久代被取消了,只剩下,年轻代----》复制清除算法 和 老年代---》标记清除算法或标记整理算法)
分代收集算法的GC分类
Minor GC---->采用复制算法,用于年轻代中
Full GC ------>
年轻代:尽可能快速地收集掉那些生命周期短的对象
Eden区----》对象刚刚被创建就是放在这里,当然,如果这里不够放,就会放到survivro或老年代上
两个Survivor区---》
-XX: MaxTenuringThreshold 这个参考可以设置对象的“岁数”,默认对象的岁数是15岁,超过这个值就被转移到老年代---》经过15次minor gc回收之后,还存活下来的对象
问题:对象如何晋升到老年代中?
1、经历一定Minor次数依然存活的对象
2、Survivor区中放不下的对象
3、新生成的大对象(-XX: +PretenuerSizeThreshold )
常用的调优参数:
-XX:SurvivorRatio: Eden 和其中一个Survivor的比值,默认8:1
-XX:NewRatio :老年代和年轻代内存大小的比例
-XX: MaxTenuringThreshold :对象从年轻代晋升到老年代经过GC次数的最大阀值
老年代:存放生命周期较长的对象----》采用标记-清理算法 或 标记-整理算法
1、Full GC 和 Major GC(一般的理解是Full GC等于 Major GC,收集整个GC堆。注意:如果有人问你Major GC的时候,一定要问清楚是Full GC 还是仅仅指老年代的GC)
2、Full GC 比 Minor GC 慢,但执行频率低
问题:什么时候触发Full GC?什么条件?
1、老年代空间不足(为了避免Full GC的发生,就避免产生大对象的生成)
2、永久代空间不足(这个只是针对JDK7和以前的版本,这也是为什么用元空间替代永久代的原因,为了降低Full GC的频率!!!!)
3、CMS GC时出现 promotion failed ,concurrent mode failure
4、Minor GC晋升到老年代的平均大小大于老年代的剩余空间
5、调用System.gc()----->注意:这只是码农提醒虚拟机进行Full GC操作,实际上还是在不确定的时上进行Full GC
6、使用RMI 进行RPC或管理的JDK应用,每小时执行1次Full GC
(一般能说出三点就可以,三点以上就更好)
Java垃圾回收之回收算法的更多相关文章
- Java垃圾回收算法和垃圾回收器
基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除的算法最简单,主要是标记出来需要回收的对象,然后然后把这些对象在内存的信息清除.如何标记需要回收的对象,在上一篇文章里面已经有说明. 标记- ...
- 深入理解java垃圾回收算法
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- java垃圾回收机制,以及常用的回收算法
记得之前去平安面试的时候,面试官问到了垃圾回收,我当时也就是说说了垃圾回收的原理,但是具体有哪些实现策略,我当时是懵的. 概念: Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定 ...
- Java垃圾回收算法和内存分配策略
垃圾回收算法和内存分配策略 Java垃圾回收 垃圾收集,也就是GC并不是Java的伴生物,而对于GC的所需要完成任务主要就是: 1.哪些内存是需要回收的? 2.何时去回收这些内存? 3.以何种方式去回 ...
- java垃圾回收几种算法
1.引用计数法 2.标记——清除法 3.标记——整理算法 4.copying算法 5.generation算法(新生代.老年代.持久代) 详情参考:深入理解 Java 垃圾回收机制
- JAVA垃圾回收-可达性分析算法
在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行.那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收.不失一般性,如果一个对象没有任何引用与之关联 ...
- Java 垃圾回收机制方法,判断对象存活算法
垃圾回收机制: 不定时去堆内存中清理不可达对象.不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回 ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- Java虚拟机5:Java垃圾回收(GC)机制详解
哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象.那么如何找到这些对象? 1.引用计数法 这个算法的实现是,给对象中添 ...
随机推荐
- android 四大组件详解
这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...
- 介绍一下Extern “C”,它的作用是什么?
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数.这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “ ...
- poj3187【dfs】
挑战-搜索 题意: 给一个n和sum,代表n层的杨辉三角,然后给一个和,问最低层的数字情况. 思路: ①:预处理一个底层对于和的系数数组, sum = 0Cn-1*num[1] + 1Cn-1*num ...
- 笔记:JavaScript闭包
闭包 闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰.直观的说就是形成一个不销毁的栈环境. 对于闭包,当外部函数返回之后,内部函数依然可以访问外部函数的变量 ...
- Mantis优化改造(技术篇)
为什么要写这篇? 既然都过去这么久了,都回忆不起来了,为什么还要整理出来这篇文章呢? 这还要追溯到2018年3月份. 当时换工作,面试了国内某知名电视厂商. 简历上面写了我优化改造了bug管理系统ma ...
- 日历 php
<?php $year=@$_GET['year']; //获得地址栏的年份 $month=@$_GET['month']; //获得地址栏的月份 if(empty($year)) $year= ...
- web 另类方法实现“另存为”功能
HTML5 的 FileReader 带给我们很强大的文件只读访问能力,可是在 HTML5 新增的 JS 中却没有发现有方便的另存到本地文件的相关 API,以往的办法要么调用浏览器的 save as ...
- Nginx缓存[proxy cache、memcache]
nginx自带缓存 nginx自己有单独的进程来对磁盘上的缓存文件进行扫描,在内存中建立缓存索引.并且有管理进程来对缓存进行过期判断,更新等操作 定义:只能在http段中使用 proxy_cache_ ...
- python staticmethod&classmethod
python中的这两种方法都通过修饰器来完成 静态方法: 不需要传递类对象或者类的实例 可以通过类的实例.方法名a().foo()或者类名.方法a.foo()名来访问 当子类继承父类时,且实例化子类时 ...
- Spring boot Jpa添加对象字段使用数据库默认值
Spring boot Jpa添加对象字段使用数据库默认值 jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其 ...