【深入理解Java虚拟机】垃圾回收
引用计数算法
给对象加一个计数器,引用一次+1,引用时效就-1,当计数器=0时对象就不能再被使用;
实现简单,判定效率高;Java虚拟接没有使用,主要原因是很难解决对象之间循环引用问题;
GC算法:
GC Roots 作为起始点,开始向下搜索,这个搜索路径叫做引用链,当一个对象到GC Roots没有任何引用链,那么这个对象就是不可用的。
Java中可作为GC Roots的对象:虚拟机栈中的引用对象、方法区中类静态属性引用对象、方法区中常量引用对象等。
标记清除算法
分为标记和清除阶段,首先标记所有需要回收的对象,在标记完后统一回收标记的对象。
堆中的老年代:因为存活率高,没有额外空间进行分配担保,就必须使用标记清理算法回收。
标记清理算法问题:
- 1、标记和清除的效率不高;
- 2、标记清除后会产生大量不连续的内存碎片,当需要分配较大对象时无法找到足够内存,又会触发垃圾收集动作;
复制算法
堆中的新生代:每次垃圾回收都有大量对象死去,只有少量存活所以使用复制算法;
jvm的复制算法是将内存划分为一块较大空间Eden和两块较小的Suvivor,一般比例是8:1:1。每次只是用Eden和Suvivor中的一块,当回收时,将Eden和Suvivor中存活的对象复制到另一块Suvivor中,再将Eden和使用的Suvivor清除掉。
标记压缩算法(标记整理)
标记-压缩算法与标记-清理算法类似,只是后续步骤是让所有存活的对象移动到一端,然后直接清除掉端边界以外的内存
垃圾收集器
常见的垃圾收集器:
Serial:新生代收集器,单线程。
ParNew:新生代收集器,Serial的多线程版本,和CMS配合工作。
Parallel Scavenge:新生代,可以控制吞吐量。配合自适应调节策略,可以让虚拟机自动完成内存调优。
Serial Old:Serial老年代版本,单线程。
Parallel Old:Parallel Scavenge老年代版本,多线程
CMS:老年代收集器,特点:并发,低停顿,以获取最短回收停顿时间为目标。基于标记-清除算法。
CMS过程:
- 1初始标记 :标记GC Roots能直接关联的对象,速度很快。
- 2并发标记 :进行GC Roots Tracing的过程,耗时长
- 3 重新标记 :修正并发标记期间不正确的标记记录
- 4 并发清除
Minor GC和Full GC之间的区别
堆内存划分为 Eden、和两块Survivor,JDK1.8移除了永久代。
- Minor GC 新生代GC: JAVA对象大多具备朝生夕灭的特性,所以Minor GC非常频繁,回收速度也比较快。
- Full GC/Major GC 老年代GC: 速度一般比Minor GC慢很多。
内存分配策略
- 对象优先在新生代Eden区中分配,当Eden区没有足够空间时,虚拟机发起Minor GC.
- 大对象直接进入老年代,大对象典型的就是很长的字符串或数组。
- 长期存活的对象进入老年代。
【深入理解Java虚拟机】垃圾回收的更多相关文章
- 深入理解java虚拟机---垃圾回收(十一)
1.垃圾回收要解决的问题 可以通过配置虚拟机参数来打印出内存日志: -verbose:gc -XX:+PrintGCDetails 垃圾收集(Garbage Collection,GC),要设计一个G ...
- Java虚拟机垃圾回收(三) 7种垃圾收集器
Java虚拟机垃圾回收(三) 7种垃圾收集器 主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java ...
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- Java虚拟机垃圾回收(三): 7种垃圾收集器(转载)
1.垃圾收集器概述 垃圾收集器是垃圾回收算法(标记-清除算法.复制算法.标记-整理算法.火车算法)的具体实现,不同商家.不同版本的JVM所提供的垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚 ...
- Java虚拟机垃圾回收(二) :垃圾回收算法(转载)
1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标 ...
- Java虚拟机垃圾回收:基础点(转载)
1.Java虚拟机垃圾回收 垃圾回收,或称垃圾收集(Garbage Collection,GC)是指自动管理回收不再被引用的内存数据. 在1960年诞生于MIT的Lisp语言首次使用了动态内存分配和垃 ...
- ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【下部】
承接上文 (完结撒花1-52系列)[JVM技术指南]「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"[上部] 并行收集器 并行收集器(也称为吞吐量收集器)是类似 ...
- Java虚拟机-------垃圾回收机机制
概述 jvm中的堆图 在了解 垃圾回收器 之前,首先得了解一下垃圾回收器的几个名词. 1. 吞吐量CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值.比如说虚拟机总运行了 100 分钟,用户代 ...
- Java虚拟机—垃圾回收算法(整理版)
1.概述 由于垃圾收集算法的实现涉及大量的程序细节.因此本节不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过程.主要涉及的算法有标记-清除算法.复制算法.标记-整理算法.分代收集算法. 2 ...
- 了解java虚拟机—垃圾回收算法(5)
引用计数器法(Reference Counting) 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器减1.只要对象A的引用计数器的 ...
随机推荐
- nuoyanli 520 Let‘s play computer game
H题 描述 xxxxxxxxx在疫情期间迷上了一款游戏,这个游戏一共有nnn个地点(编号为1--n1--n1--n),他每次从一个地点移动到另外一个地点需要消耗 一定的能量,每一个地点都有一些珠宝,输 ...
- Codeforces Round #658 (Div. 2) C1. Prefix Flip (Easy Version) (构造)
题意:给你两个长度为\(n\)的01串\(s\)和\(t\),可以选择\(s\)的前几位,取反然后反转,保证\(s\)总能通过不超过\(3n\)的操作得到\(t\),输出变换总数,和每次变换的位置. ...
- 在程序中通过Process启动外部exe的方法及注意事项
启动外部进程的方法: /// <summary> /// 启动外部进程 /// </summary> /// <param name="path"&g ...
- 【非原创】codeforces 1029F Multicolored Markers 【贪心+构造】
题目:戳这里 题意:给a个红色小方块和b个蓝色小方块,求其能组成的周长最小的矩形,要求红色或蓝色方块至少有一个也是矩形. 思路来源:戳这里 解题思路:遍历大矩形可能满足的所有周长,维护最小值即可.需要 ...
- nextLine()和next()的区别和使用方法
最近在笔试,刷剑指Offer时,都是只需要把方法实现了就行.但是!!!笔试时候会发现,大部分会要求你把main函数也code出来,真是醉了,第一次笔试时候搞的晕乎乎的..... 废话不多说,那么在写输 ...
- UVA-10815 Andy's First Dictionary (非原创)
10815 - Andy's First Dictionary Time limit: 3.000 seconds Problem B: Andy's First DictionaryTime lim ...
- codeforces 5C
C. Longest Regular Bracket Sequence time limit per test 2 seconds memory limit per test 256 megabyte ...
- Leetcode(104)-二叉树的最大深度
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...
- springboot demo(一)快速开始
快速入门 maven构建项目 1.访问http://start.spring.io/ 2.选择构建工具Maven Project.Spring Boot版本2.26以及一些工程基本信息,点击" ...
- OpenCV3.2+Python3.5+Ubuntu16.04+缺少boostdesc和vgg_generated
问题: OpenCV3.2在cmake通过https无法获取boostdesc和vgg_generated2类文件 可尝试的解决方法: 参考, 依其方法至这里做调整, 最后注释xfeatures2d/ ...