【深入理解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.
- 大对象直接进入老年代,大对象典型的就是很长的字符串或数组。
- 长期存活的对象进入老年代。
最新文章
- lianjie
- 【GoLang】GoLang map 非线程安全 &; 并发度写优化
- 二、Spring——AoP
- MIUI选项框开关样式模拟
- [转载]WCF实现双工通信
- COM组件(ActiveX)控件注册失败
- 如何在使用了updatepanel后弹出提示信息
- CSS实现DIV三角形
- C++ 文本读写
- 无线hacking系统—wifislax
- macbookPro 搭建maven环境下载jar包
- KNN算法简单应用
- 0517JS综合练习、挂事件练习
- Fragment生命周期以及使用时的小问题
- dva中roadhog版本升级后带来的问题及解决方法
- Java核心技术之基础知识
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\文件不断增长,如何处理?
- [POJ3041]Asteroids
- 关于Safe DOG的文件上传bypass
- PHPStorm自动压缩YUI Compressor配置
热门文章
- java——字符串常量池、字符串函数以及static关键字的使用、数组的一些操作函数、math函数
- hdu5459 Jesus Is Here
- 踏上Revit二次开发之路 2 从“HelloWorld”入手
- GO - LLT
- 2019南昌网络赛H The Nth Item(二阶线性数列递推 + 广义斐波那契循环节 + 分段打表)题解
- JavaScript Engine 可视化
- ossutilmac64
- 高阶类 &; HOC &; anonymous class extends
- queueMicrotask &; EventLoop &; macrotask &; microtask
- Top 10 JavaScript errors