JVM GC总结
判断对象存活
引用计数算法
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1,引用失效时,计数器就减1;任何时刻计数器都为0的对象就是不可能再被使用的。
问题:无法解决对象之间的相互循环引用
根搜索算法(java,c#,List)
通过一系列的名为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索通过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
在java中,GC Roots对象包括
- 虚拟机栈(栈帧中的本地变量表)中的引用的对象
- 方法区中的类静态属性引用的对象
- 方法区中的常量引用的对象
- 本地方法栈中JNI(即一般说的Native方法)的引用的对象
引用
- 强引用 - 只要强引用还在,就不会被回收 
 "Object obj = new Object()"
- 软引用 - 在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围并进行第二次回收。 
- 弱引用 - 被弱引用关联的对象只能生存到下一次垃圾收集之前 
- 虚引用 - 一个对象是否有虚引用不对其生存时间构成影响 
垃圾收集算法
多个算法一起工作
分代收集算法
根据对象的存活周期的不同将内存划分为几块。一般是把java堆分为新生代和老年代。新生代适合选用复制算法,老年代对象存活率高,没有额外空间分配担保,就必须使用“标记-清理”或“标记--整理”
复制算法
将可用内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活的对象复制到另外一块上面,然后把已使用过的内存空间清理掉
在虚拟机的实现中,将新生代分为一块较大的Eden空间和两块较小的Survior空间(8:1:1),每次使用Eden和其中的一块Survivor。当回收时,将Eden和Survivor中还存活的对象一次性的拷贝到另外一块Survivor,最后清理掉Eden和刚才的Survivor.
- 内存分配 - 对象优先在Eden分配,一次gc后进入Survivor
- 大对象直接进入老年代 - 避免Eden与两个Survivor区之间发生大量的内存拷贝 
- 长期存活的对象将直接进入老年代 - 对象年龄计数器,经过15次gc而不死 
 
标记-清除
首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象
问题:
效率低,产生大量内存碎片
标记-整理算法
让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
垃圾收集器
| Serial | Serial Old | ParNew | Parallel Scavenge | Parallel Old | 
|---|---|---|---|---|
| 单线程 | 单线程 | 多线程 | 多线程 | 多线程 | 
| 新生代 | 老年代 | 新生代 | 新生代 | 老年代 | 
CMS
并发收集,低停顿,标记-清除算法
G1
之前的收集器进行收集的范围都是整个新生代或老年代,而G1将整个java堆(包括新生代,老年代)划分为多个大小固定的独立区域,并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域。
回收方法区
- 废弃常量
- 无用的类
- 该类所有实例已回收
- 加载该类的ClassLoader已回收
- 该类对应的Class对象没有在任何地方被引用
 
JVM GC总结的更多相关文章
- 如何避免后台IO高负载造成的长时间JVM GC停顿(转)
		译者著:其实本文的中心意思非常简单,没有耐心的读者建议直接拉到最后看结论部分,有兴趣的读者可以详细阅读一下. 原文发表于Linkedin Engineering,作者 Zhenyun Zhuang是L ... 
- 【转载】Java性能优化之JVM GC(垃圾回收机制)
		文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ... 
- JVM GC机制
		垃圾收集主要是针对堆和方法区进行. 回收机制: 现在的JVM基本都使用分代回收机制,把堆中内存区域分为新生代,老年代. 新生代: Eden(80%) Survivor0(10%) Survivor1( ... 
- 深入浅出 JVM GC(3)
		# 前言 在 深入浅出 JVM GC(2) 中,我们介绍了一些 GC 算法,GC 名词,同时也留下了一个问题,就是每个 GC 收集器的具体作用.有哪些 GC 收集器呢? Serial 串行收集器(只适 ... 
- 深入浅出 JVM GC(2)
		# 前言 在 深入浅出 JVM GC(1) 中,限于上篇文章的篇幅,我们留下了一个问题 : 如何回收? 这篇文章将重点讲述这个问题. 在上篇文章中,我们也列出了一些大纲,今天我们就按照那个大纲来逐个讲 ... 
- JVM 自带性能监测调优工具 (jstack、jstat)及 JVM GC 调优
		1. jstack:占用最多资源(CPU 内存)的Java代码 https://www.cnblogs.com/chengJAVA/p/5821218.html https://blog.csdn.n ... 
- 理解JVM GC
		理解JVM GC对于我们把控Java应用有很大的帮助.下面我从运维角度,把网上的JVM相关的资料整理如下,以加深对JVM GC的理解.如有错误的地方,请看官指正. JVM内存使用分类 JVM的内存分区 ... 
- Java性能优化之JVM GC(垃圾回收机制)
		Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ... 
- JVM  gc介绍
		Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ... 
- 一夜搞懂 | JVM GC&内存分配
		前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习GC&内存分配? 时代发展到现在,如今的内存动态分配与内存回收技术已经相当成 ... 
随机推荐
- 【ZOJ2314】Reactor Cooling(有上下界的网络流)
			前言 话说有上下界的网络流好像全机房就我一个人会手动滑稽,当然这是不可能的 Solution 其实这道题目就是一道板子题,主要讲解一下怎么做无源无汇的上下界最大流: 算法步骤 1.将每条边转换成0~u ... 
- POST与GET请求的区别
			https://www.cnblogs.com/logsharing/p/8448446.html 返回主页 在途中# 博客园首页新随笔联系订阅管理 随笔 - 33 文章 - 5 评论 - 40 GE ... 
- 程序媛计划——python正则表达式
			#定义 正则表达式是对字符串操作的一种逻辑公式,通过它我们能筛选过滤出我们需要的内容,如判断一串数字是否是电话号码. #原理 先把正则表达式的字符串转换成 Pattern 对象,接着用这个对象处理文本 ... 
- 使用putty连接本地VirtualBox上的centos7 linux主机
			1. 查看linux主机默认ssh端口 因为是使用ssh连接虚拟机上的linux主机的,所以需要查看centos ssh默认端口,一般是22 打开终端 输入cd /etc/ssh/ 查看ssh_con ... 
- hdoj1373 Channel Allocation(极大团)
			题意是有若干个接收器,给出每个接收器的相邻接收器.相邻的接收器不能使用同一信号频道.问所需要的信号频道数. 求该无向图的极大团. #include<iostream> #include&l ... 
- mysql_load_data及权限管理
			———————————————————————————————————————— 添加权限: The only priv_type values you can specify for a table ... 
- JS-DOM Element方法和属性
			JS-DOM Element方法和属性 S-DOM Element方法和属性一,获取html元素1.getElementByID(id)通过对元素的ID访问,这是DOM一个基础的访问页面元素的方法.e ... 
- Xshell连接不上虚拟机Linux系统
			以下是我在尝试网上各种办法之后总结的最优解决办法: 1.先在主机上检查虚拟机相关的必要的服务是否都已经启动 2.检查虚拟机系统防火墙是否处于关闭状态 3.检查虚拟机系统的ssh服务是否已经启动 4.检 ... 
- WebDriverAPI(10)
			操作Frame页面元素 测试网址代码 frameset.html: <html> <head> <title>frameset页面</title> &l ... 
- 剑指offer五十七之二叉树的下一个结点
			一.题目 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 二.思路 结合图,我们可发现分成两大类: 1.有右子树 ... 
