JVM 垃圾回收机制和常见算法
垃圾回收机制:释放那些不再持有引用的对象的内存。
如何判断对象是否需要回收?
- 引用计数:对象,内存,磁盘空间等被引用次数保存起来,次数为0时将其进行释放。
- 对象引用遍历:对象应用遍历从一组对象开始,沿着对象图的每条链接,递归课到达对象,如果不能从根对象到达,则将它进行回收。
垃圾回收方法?
1. 标记清除法:遍历对象图并记录可达对象,以便删除不可达对象,一般使用单线程工作并可能产生内存碎片,标记回收会分为“标记”、“清除”两阶段,先标记需要回收的对象,标记后统一进行清除。标记清除过程效率不高;
2. 标记整理法:遍历对象图并记录可达对象,以便删除不可达对象,一般使用单线程工作并可能产生内存碎片,并将存活对象压缩到内存的一端,这样内存碎片可以合成一整块可用内存区域,提高内存利用率,缺点进行对象移动,成本较高,好处是不会产生内存碎片。
3. 复制回收法:复制回收将可用内存划分为大小相等的两块,每次只是用其中一块,当这块使用完的时候,就将还存活的对象复制到另一块内存中去,然后在把已经使用过的内存空间一次性处理掉,这样使得每次都是对其中的一块进行内存回收,不会产生碎片等情况,只要移动对指针,按照顺序分配内存即可,实现简单,运行高效,缺点,内存占用多一半。
4. 分代回收法:根据对象的存活周期的不同将内存划分为几块,一般将java堆分为新生代和老年代,这样就可以根据各个年代的特点采用适当的收集算法:
新生代:垃圾回收的时候发现大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
老年代:对象存活率高,没有额外空间对他进行分配担保,就必须使用标记清理算法进行回收。
垃圾回收器:
serial收集器:android 2.3之前采用这个收集器进行垃圾回收,会停止所有的UI操作。单线程收集器,只会使用一个CPU或一条线程去完成工作,进行垃圾回收的时候,暂停其他工作线程,直到工作完毕。对于限定单个CPU的环境,serial收集器没有线程交互,自然高效。
parNew收集器:serial收集器的多线程版本,运行在server模式下首选的收集器,能够和CMS收集器配合工作,CMS收集器是个优秀的并发垃圾收集器,parNew能与其搭配让parNew收集器更加完美。
parallel Scavenge收集器:新生代收集器,利用复制算法进行回收,并发多线程收集器,可控制吞吐量(运行用户代码时间/(运行用户代码时间+垃圾收集时间))的收集器。可以设置最大垃圾停留时间和吞吐量大小,打开垃圾收集将根据当前系统运行状态自动调节,这种方式成为GC自适应调节策略。手工优化存在困难的时候可直接交给虚拟机去完成。
G1收集器:结合空间整合,不会产生大量碎片,降低GC频率。可明确指定停顿时间,划分优先级操作,保证效率。
CMS收集器:获取最短回收停顿时间为目标的收集器。应用于互联网B/S架构的服务器上,重视响应时间。采用标记-清除算法,效率上占用CPU资源,使得应用程序变慢,无法处理浮动垃圾;算法是会产生大量碎片,无法为大对象分配内存的时候出发full gc,cms默认提供参数默认开启full gc。
JVM 垃圾回收机制和常见算法的更多相关文章
- jvm垃圾回收机制和常见算法
这是朋友给的面试题里边的,具体地址已经找不到,只能对原作者说声抱歉了: 理论上来讲sun公司只定义了垃圾回收机制规则,而步局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同. GC(Gar ...
- JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)
一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...
- JVM垃圾回收机制和常用算法
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...
- JVM虚拟机(四):JVM 垃圾回收机制概念及其算法
垃圾回收概念和其算法 谈到垃圾回收(Garbage Collection)GC,需要先澄清什么是垃圾,类比日常生活中的垃圾,我们会把他们丢入垃圾箱,然后倒掉.GC中的垃圾,特指存于内存中.不会再被使用 ...
- JVM内存管理和JVM垃圾回收机制
JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...
- JVM垃圾回收机制概述
JVM垃圾回收机制概述 1.定义 是指JVM用于释放那些不再使用的对象所占用的内存. 2.方式 2.1引用计数(早期) 当引用程序创建引用以及引用超出范围时,JVM必须适当增减引用数.当某个对象的引用 ...
- JVM基础系列第8讲:JVM 垃圾回收机制
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- 真的可惜,四面阿里,结果我被JVM垃圾回收机制与 OOM异常卡住了
前言 为什么需要垃圾回收 首先我们来聊聊为什么会需要垃圾回收,假设我们不进行垃圾回收会造成什么后果,我们举一个简单的例子 我们住在一个房子里面,我们每天都在里面生活,然后垃圾都丢在房子里面,又不打扫, ...
随机推荐
- Python-RabbitMQ(持久化)
生产者: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import pika connection = pika.BlockingConnection(pi ...
- eclipse以MapReduce本地模式运行程序
1.准备好所需的文件winutils.exe.hadoop-eclipse-plugin-2.7.3.jar.hadoop-common-2.2.0-bin-master.zip 下载路径:http: ...
- 满帮集团CEO:未来将向“智慧型”公司转变,要成为一家生态公司
谁都想成为下一个滴滴.显然,王刚也希望在物流业,货车帮与运满满在合并后,能够企及滴滴的高度. 货车帮与运满满,都曾是货运物流领域的翘楚,也因为业务的竞争关系有过水火不容厮杀.但最终还是在资本与地方政府 ...
- python基础知识-12-模块的了解
python其他知识目录 1.模块介绍: Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句.模块让你能够有逻辑地组织你 ...
- delphi 图像处理 二值化
procedure TDR_QM_ZP_Form.Image_EZH( Bmp: TBitmap ); var p: PByteArray; Gray, x, y: Integer; begin // ...
- String 类 的 使用
package com.StringUse; import java.util.Arrays; /* String 的构造方法: String() 创建一个空内容 的字符串对象. String(byt ...
- Team饭来了团队作业3需求改进与系统设计
团队名称:饭来了 人员组成: 队长:侯晓东 学号:2016012087 队员:崔啸寒 学号:2016012006 队员:方柱权 学号:201601 ...
- js+Canvas 利用js 实现浏览器保存图片到本地
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- delphi中将一个ADOQuery查询的数据结果传递给一个动态生成的ADOQuery
delphi中将一个ADOQuery查询的数据结果传递给一个动态生成的ADOQuery 2010-03-10 17:35 方法一: beginADOQuery:=TADOQuery.Create(Ap ...
- markdown语法---根据使用不断扩充中
markdown语法 标题 标题使用 #表示,几个#表示几级标题,最多六级标题. 斜体 使用 两个星号*括起来的文字是斜体字 这是斜体字 粗体 使用四个 * 号括起来的是粗体字. 这是粗体字 引用 这 ...