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时可以回收.此方法简单,但无法解决对象相互循环引用的问 ...
随机推荐
- Linux系统之常用文件搜索命令
(一)常用文件搜索命令 (1)which命令 (2)find命令 (3)locate (4)updatedb (5)grep (6)man (7)whatis (一)常用文件搜索命令 (1)which ...
- activate-power-mode 插件 安装 设置 IDEA
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com 可用 摇 shake 粒子 particle ...
- CF 633 F. The Chocolate Spree 树形dp
题目链接 CF 633 F. The Chocolate Spree 题解 维护子数答案 子数直径 子数最远点 单子数最长直径 (最长的 最远点+一条链) 讨论转移 代码 #include<ve ...
- BZOJ.5404.party(树链剖分 bitset Hall定理)
题目链接 只有指向父节点的单向道路,所以c个人肯定在LCA处汇合.那么就成了有c条到LCA的路径,求最大的x,满足能从c条路径中各选出x个数,且它们不同. 先要维护一条路径的数的种类数,可以树剖+每条 ...
- 转载:Gitlab备份和恢复操作记录
转载:Gitlab备份和恢复操作记录 包含了备份和数据恢复的操作记录,实验可行 前面已经介绍了Gitlab环境部署记录,这里简单说下Gitlab的备份和恢复操作记录: 1)Gitlab的备份目录路径设 ...
- 用vue的自定义组件写了一个拖拽 组件,局部的 只能在自定义元素内的
简单实现 没有做兼容<!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Matplotlib新手上路(中)
接上回继续 一.多张图布局(subplot) 1.1 subplot布局方式 import matplotlib.pyplot as plt plt.figure() plt.subplot(3, 2 ...
- WordPress基础:极简手动安装教程
1.下载WordPress 2.将解压后的文件夹,放到网站根目录,并重命名为你喜欢的目录如:w, 3.重命名文件wp-config-sample.php 为 wp-config.php,并进行配置 4 ...
- Scala:Next Steps in Scala
Array val greetStrings = new Array[String](3) greetStrings(0) = "Hello" greetStrings(1) = ...
- maven学习一(HelloWorld工程)
maven是一个出色的java工程依赖管理的工具,刚刚开始学习用maven建立一个HelloWorld工程. maven安装 $ wget http://mirrors.cnnic.cn/apache ...