理解JVM之垃圾回收
1.垃圾收集算法
1) 标记-清楚算法:该算法是最基础的收集算法,其分为标记与清除两个阶段.首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,该算法主要有两个不足:一个是效率问题,标记与清除都是两个效率不高的过程;另一个空间问题,标记清除会产生大量不连续的内存空间,碎片空间过多会导致无法分配较大对象.
2) 复制算法:为了解决效率问题跟空间碎片化的问题.该算法将内存分为两个大小相等的两块,每次使用其中一块.当这一块的内存用完了,就将还存活的对象赋值到另一块去,然后把已使用过的内存空间清理掉.这种算法实现简单运行高效.但是代价是将内存缩小一半,代价太高.
3) 标记-整理算法:该算法 标记过程与第一种算法一样,但后续步骤不是清理而是让存活的对象向一端移动,然后直接清理掉端边界以外的内存.
4) 分代算法:这种算法是将java堆分为老年代和新生代,根据各年代的特点采用最合适的收集算法.
2.垃圾收集算法的选择
现在的商业虚拟机都是采用复制算法回收新生代,原因是新生代98%都是朝生夕死的.所以并不需要1:1的划分空间,而是将内存分为一块较大的Eden空间和两块survivor空间.回收时,将Eden空间和Survior中活着的对象复制到另一个survivor空间上,最后清理Eden和刚才使用的survivor空间,HotSpot虚拟机默认Eden和Survivor空间大小比例是8:1,也就是只会浪费10%的空间,当然98%这是一般情况下的数据,我们没有办法保证每次回收存活的对象都低于10%.当survivor空间不够用时,需要依赖其他内存(老年代)进行分配担保.如果另一块survivor空间没有足够的空间存放上一次新生代收集下来存活的对象时,这些对象直接通过分配担保机制进入老年代.
老年代中对象存活率高且没有额外空间对他进行担保,所以必须使用标记-清理或者标记-整理算法进行回收.
3.回收方法区
很多人认为方法区没有垃圾收集(因此被称为永久代),虽然java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且这方法区垃圾收集的性价比一般比较低,在堆中一次垃圾回收一般可以回收70%-95%,而方法区的效率且性价比远低于此.但是实际上方法区是有垃圾收集的.
方法区垃圾收集主要回收两部分内容:废弃常量和无用的类.回收常量与回收堆很相似.以常量池中的字面量为例,假如有一个字符串A,如果系统中没有任何一个引用关联A,则A会被清理出常量池,常量池中的方法,字段,其他类(接口)的符号引用也与此类似.
判断一个无用类的条件:1.该类的所有实例都被回收 2.加载该类的ClassLoader已经被回收 3.该类对应的java.lang.Class对象没有在儿女和地方被引用们无法在任何地方通过反射访问该类的方法,.满足以上条件则进行无用类回收即类型的卸载.
理解JVM之垃圾回收的更多相关文章
- 深入理解JVM——关于垃圾回收
关于垃圾回收 仿佛来自上海居委会大妈的灵魂拷问:“你是什么垃圾?” 不 今天我们要说的是JVM的垃圾回收 假如我是一个“人”类的“对象”,也和人的生命一样必有一死,可是“我真的还想再活500年~~”, ...
- 深入理解JVM一垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. 一.stop the world 在介绍 ...
- 深入理解JVM(五) -- 垃圾回收算法
上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现. 一 最基础算法 标记-清除(Mark-Swap) 为什么说他是最基础的算法,因 ...
- 03 JVM的垃圾回收机制
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
- JVM虚拟机—JVM的垃圾回收机制(转载)
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
- jvm的垃圾回收算法
一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...
- JVM(九):垃圾回收算法
JVM(九):垃圾回收算法 在本文中,我们将从概念模型的角度探讨 JVM 是如何回收对象,包括 JVM 是如何判断一个对象已经死亡,什么时候在哪里进行了垃圾回收,垃圾回收有几种核心算法,每个算法优劣是 ...
- 2.1.JVM的垃圾回收机制,判断对象是否死亡
因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ...
随机推荐
- Qt编写自定义控件47-面板区域控件
一.前言 在很多web网页上,经常可以看到一个设备对应一个面板,或者某种同等类型的信息全部放在一个面板上,该面板还可以拖来拖去的,这个控件首次用在智能访客管理平台中,比如身份证信息一个面板,访客信息一 ...
- [简短问答]LODOP如何查看用LODOP打印设计的代码
该博文为图文简短问答,具体详细介绍可查看本博客的相关博文,生成JS代码相关详细博文:Lodop打印设计(PRINT_DESIGN)介绍.Lodop打印设计.维护.预览.直接打印简单介绍.Lodop打印 ...
- EasyNetQ使用(八)【对延迟消息插件的支持,自动订阅者】
RabbitMQ延迟消息插件仍然在实验阶段.你使用这个功能要自担风险. RabbitMQ延迟消息插件为RabbitMQ增加了新的交换机类型,允许延时消息投递. EasyNetQ为交换机通过定义一种新的 ...
- 欧姆龙 EntherNet/IP(CIP报文格式)
Enthip/IP_ CIP报文格式 测试Demo在文章末尾 注册请求帧: 0x65 0x00 注册请求命令 2byte 0x04,0x00 header长度2byte < 封装头& ...
- Loaded plugins: fastestmirror, refresh-packagekit, security
问题描述 最近在用Centos 6.7的时候出现了这种情况 Loaded plugins: fastestmirror, refresh-packagekit, security Loading mi ...
- tomcat性能优化参数
线上环境使用默认tomcat配置文件,性能很一般,为了满足大量用户的访问,需要对tomcat进行参数性能优化,具体优化的地方如下: Linux内核的优化 服务器资源JVM 配置的优化 Tomcat参数 ...
- OS选择题练习
一.死锁 1.设系统中有n个进程并发,共同竞争资源X,且每个进程都需要m个X资源,为使该系统不会发生死锁,资源X的数量至少为() A.n*m+1 B.n*m+n C.n*m+1-n D.无法预计 ...
- IO操作-BIO
BIO:block IO,即同步阻塞IO,主要应用于文件 IO 和网络 IO 这里主要说一下网络IO,以Socket编程为例进行说明 1.先建立Socket服务端 //BIO 服务器端程序 publi ...
- Java面试 - == 和 equals 的区别?
==:如果比较的对象是基本数据类型,则比较的是数值是否一致:如果比较的是引用数据类型,则比较的是对象的地址值是否一致. equals():equals()方法不能用于比较基本数据类型的对象,如果对象和 ...
- vmware安装win7*64位时,安装不成功的关键点是光驱接口类型选择为IDE模式
mware 安装win7*64时,找不到光盘,后来在xin7*64的虚拟机下的编辑虚拟机设置 找到光驱,点击高级,并选择IDE即可,这样就可以进入虚拟机找到光驱和硬盘到了.进入winpe后可以看到各种 ...