JVM——垃圾回收(GC)
GC简单介绍
java语言执行在java虚拟机(jvm)上。为了解决有限的空间和性能的保证这个矛盾体,jvm所具备的GC能力。能够有效的清除不用的对象。使空间的利用更加合理。以下介绍该机制的原理。
推断对象已废弃
- 引用计数法
给每个对象都配备一个计数器,对于该对象,若添加一个指向它的引用,则计数器加1。每失效一个引用。则计数器减一。
可是,假设两个对象互相引用,但都对于外部都已失去用途,则这种两个对象是无法被计数为0的,由于他们的计数器永远都仅仅为1。 - 可达性分析法
为了解决引用计数法的缺陷,我们引入可达性分析。
从引用链的顶端root開始,仅仅要在这条引用链上的对象都是实用的,因此不应该被回收。而对于剩下的对象,一定是不可到达的对象,也就没什么意义了。
怎样释放没用的对象空间
标记清除
将废弃的对象空间标记出来,直接清除就可以。可是。这样会造成空间的碎片过多。
假设有较大的对象须要空间,则会有更大的可能,它无法找到这种空间。
复制法
将堆空间分为两块,最好还是叫做from和to。每次new对象的时候。先放在from上,(to块保持空暇),直到from区域放满。这是要进行垃圾回收,将存活的对象拷贝到 to上,然后清空from区域,并将from和to进行互换,又一次開始。
缺点是,总有一部分空间要充当to区域,因此该区域总是空暇着等待交换。造成内存的浪费。标记整理
相似于标记清楚,仅仅只是是在标记之后不是简单的清除,而是将存货对象整理好。一个一个排在一起。让后释放剩下的连续的一整块空间。这样做的坏处是。须要对全部对象进行复制移动,比較耗时。分代处理
将堆内存区分为Eden区,survivorFrom区、surviorTo区(以上三个都属于年轻代),老年代和永久代。- 当新建对象的时候通常是首先放在年轻代的Eden和surviorFrom中,当满了之后,将存活对象放入survivorTo中(及MinorGC),放不下的直接放入年老代。互换survivor的from和to区。
- 当老年代也满了之后。将执行一整个的大清洗FullGC,将全部堆内存(除了永久代)进行一次完整的GC。
- 永久代是不会在主程序执行期间进行GC的。永久代主要存放Class类信息。
JVM——垃圾回收(GC)的更多相关文章
- 性能测试三十五:jvm垃圾回收-GC
垃圾回收-GC 三个问题 哪些内存需要回收? 什么时候回收? 如何回收? YoungGC和FullGC: 新生代引发的GC叫YoungGC 老年代引发的GC叫FullGC FullGC会引起整个Jvm ...
- JVM 垃圾回收GC Roots Tracing
1.跟搜索算法: JVM中对内存进行回收时,需要判断对象是否仍在使用中,可以通过GC Roots Tracing辨别. 定义: 通过一系列名为”GCRoots”的对象作为起始点,从这个节点向下搜索,搜 ...
- JVM垃圾回收(GC)流程
/* 首先介绍一下JVM中堆内存的组成: JVM堆内存主要由三部分组成: (1)新生代: 伊甸园区,存活区,伸缩区 (2)老年代: 老年区,伸缩区 (3)元空间(永久代): 元空间,伸缩区 注意:JD ...
- JVM垃圾回收——GC
一.JVM内存分配与回收 下图为堆内存结构图(注意:元数据区(MetaData )实际上不属于堆): 1.对象优先在Eden区分配 大多数情况下,对象在新生代中Eden区分配.当Eden区没有足够空间 ...
- JVM垃圾回收GC
1.堆的分代和区域 (年轻代)Young Generation(eden.s0.s1 space) Minor GC (老年代)Old Generation (Tenured space) ...
- JVM—垃圾回收GC算法
1 GC算法简介 算法 特点 标记-清除 分为"标记"和"清除"两个阶段 复制 可以解决效率问题,将可用的内存按容量划分为大小相等的两块. 标记-整理 先标记. ...
- 修改Tomcat的jvm的垃圾回收GC方式为CMS
修改Tomcat的jvm的垃圾回收GC方式 cp $TOMCAT_HOME/bin/catalina.sh $TOMCAT_HOME/bin/catalina.sh.bak_20170815 vi $ ...
- Java:JVM垃圾回收(GC)机制
JVM垃圾回收算法 1.标记清除(Mark-Sweep) 原理: 从根集合节点进行扫描,标记出所有的存活对象,最后扫描整个内存空间并清除没有标记的对象(即死亡对象)适用场合: 存活对象较多的情况下比较 ...
- .Net平台GC VS JVM垃圾回收
前言 不知道你平时是否关注程序内存使用情况,我是关注的比较少,正好借着优化本地一个程序的空对比了一下.Net平台垃圾回收和jvm垃圾回收,顺便用dotMemory看了程序运行后的内存快照,生成内存快照 ...
- JVM垃圾回收(GC)
JVM垃圾回收(GC) 1. 判断对象是否可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,但无法解决对象相互循环引用的问 ...
随机推荐
- 李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- ThreadPoolExecutor 源码阅读
目录 ThreadPoolExecutor 源码阅读 Executor 框架 Executor ExecutorService AbstractExecutorService 构造器 状态 Worke ...
- Git学习笔记:基础篇
git可以说是所有开发者出开发语言之外的最基本的基本功了,熟悉git可以方便的进行代码版本控制,以及与其他开发者进行合作开发.本文内容是我以往学习git时做的笔记,主要是关于git最基本的操作,但 只 ...
- Python3基础之异常结构
自定义异常类 class ShortInputException(Exception): def __init__(self, length, atleast): Exception.__init__ ...
- C++ 随机数rand()和srand()
标准函数库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h中定义的一个整数,它与系统有关. 例如在我的机器上,RAND_MAX=32767.可以 ...
- linux find命令用法
Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...
- react-native组件封装与传值
转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-component-packaging-and- ...
- [原创]Java性能优化权威指南读书思维导图4
[原创]Java性能优化权威指南读书思维导图4
- Dll注入经典方法完整版
总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...
- selenium+python自动化80-文件下载(不弹询问框)
前言 上一篇是点弹出框上的按钮去保存文件,本篇介绍一种更加优雅的方法,加载Firefox和Chrome的配置文件,不弹出询问框后台下载. 一.FirefoxProfile 1.点下载的时候,如下图,如 ...