Gc&垃圾回收
文章平均质量分 88
OkidoGreen
这个作者很懒,什么都没留下…
展开
-
CMS垃圾收集器—重新标记和浮动垃圾的思考,并发标记带来的问题
深入理解java虚拟机 第二版 JVM高级特性与最佳实践》里面提到 CMS 垃圾收集器。CMS 垃圾收集器的垃圾回收分4个步骤:初始标记(initial mark) 有 STW 并发标记(concurrent mark) 没有 STW 重新标记(remark) 有 STW 并发清除(concurrent sweep) 没有 STW初始标记:仅仅标记 GC Roots 能直接关联到的对象。并发标记:对初始标记标记过的对象,进行 trace(进行追踪,得到所有关联的对象,进行标记)重新标记:转载 2020-12-13 11:27:57 · 2483 阅读 · 3 评论 -
G1 SATB和Incremental Update算法的理解
着色标记我们都知道cms gc 和g1 gc 的算法都是通过对gc root 进行遍历,并进行三颜色标记,具体标记算法如下:黑色(black):节点被遍历完成,而且子节点都遍历完成。 灰色(gray): 当前正在遍历的节点,而且子节点还没有遍历。 白色(white):还没有遍历到的节点,即灰色节点的子节点。并行gc 面对的共同问题我们都知道cmg gc 和g1 gc 都是和程序有并行执行的阶段。既然有并行,那就有可能在并行运行期间之前的标记过的对象的引用关系可能被改变,比如一个白色对象从被转载 2020-12-13 11:21:01 · 3134 阅读 · 0 评论 -
【重要】三色标记法与垃圾回收器(CMS、G1)
三色标记法-算法思想三色标记法将对象的颜色分为了黑、灰、白,三种颜色。黑色:该对象已经被标记过了,且该对象下的属性也全部都被标记过了。(程序所需要的对象) 灰色:该对象已经被标记过了,但该对象下的属性没有全被标记完。(GC需要从此对象中去寻找垃圾) 白色:该对象没有被标记过。(对象垃圾)算法流程:从我们main方法的根对象(JVM中称为GC Root)开始沿着他们的对象向下查找,用黑灰白的规则,标记出所有跟GC Root相连接的对象 扫描一遍结束后,一般需要进行一次短暂的STW(Stop转载 2020-09-14 19:58:11 · 974 阅读 · 0 评论 -
Java中9种常见的CMS GC问题分析与解决
1. 写在前面| 本文主要针对 Hotspot VM 中“CMS + ParNew”组合的一些使用场景进行总结。重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省略较多,另外本文专业术语较多,有一定的阅读门槛,如未介绍清楚,还请自行查阅相关材料。| 总字数 2 万左右(不包含代码片段),整体阅读时间约 30min ,文章较长,可以选择你感兴趣的场景进行研究。1.1 引言自 Sun 发布 Java 语言以来,开始使用 GC 技术来进行内存自动管理,避免了手动管理带来的悬挂指针(转载 2020-11-20 09:47:46 · 1582 阅读 · 0 评论 -
JVM系列之垃圾回收器(下篇)——Shenandoah垃圾回收器
1. 前言虽然目前大部分系统使用的是 JDK8,使用的垃圾回收器也大概率为 G1 或者更古老的垃圾回收器,但是截止到目前为止,JDK 已经更新到 JDK14 了,垃圾回收器也几乎在每一次迭代中被更新,目前最前沿的垃圾回收器为 Shenandoah 和 ZGC,这两款垃圾回收器都是以低延时为主要目的。由于内容较多,本文先只介绍 Shenandoah,下一篇再介绍 ZGC。2. Shenandoah 概述Shenandoah 的目标是将垃圾回收的停顿时间控制在 10ms 以内,这意味着 Shen转载 2020-07-06 18:12:21 · 1490 阅读 · 0 评论 -
JVM系列之经典垃圾回收器
上篇:https://mp.weixin.qq.com/s/GVabLd4BAZGDBe9xL86k3w1.前言随着 JDK 的不断更新,垃圾回收器的效率也越来越高。每一次 JDK 的更新,必然会包含有垃圾回收器的更新,截止目前,在最新的 JDK14 版本中,最新的垃圾回收器为 ZGC。从垃圾回收器发展至今,出现过很多垃圾回收器,例如:Serial、ParNew、Parallel Scavenge、SerialOld、CMS、Parallel Old、G1、Shenandoah、ZGC 等,虽然转载 2020-06-28 10:47:31 · 729 阅读 · 0 评论 -
解密Java内存溢出之持久代
垃圾回收是Java程序员了解最少的一部分。他们认为Java虚拟机接管了垃圾回收,因此没必要去担心内存的申请,分配等问题。但是随着应用越来越复杂,垃圾回收也越来越复杂,一旦垃圾回收变的复杂,应用的性能将会大打折扣。所以,Java程序员了解垃圾回收的机制并且知道怎样解决“内存溢出”问题会有很大的益处。在Java中,有两个非常普遍的内存溢出问题。一个是堆内存溢出,另一个是持久代内存溢出。持久代和类加载器 Java对象是java 类的实例。每当创建一个Java对象时,Java虚拟机都会创建该对象...转载 2020-06-20 20:01:41 · 903 阅读 · 0 评论 -
CMS的CMSInitiatingOccupancyFraction 及 触发条件
CMS触发条件:https://blog.csdn.net/a479898045/article/details/96074872使用例子:-XX:CMSInitiatingOccupancyFraction=70CMS垃圾收集器,当老年代达到70%时,触发CMS垃圾回收。查看CMSInitiatingOccupancyFraction的初始值为-1intx CMSInitiat...转载 2020-03-19 21:14:00 · 2680 阅读 · 0 评论 -
(源码分析)关于gc日志中Desired Survivor的疑问和对象晋升老年代的小结
问题背景(下面的所有内容都是根据书上的Serial/Serial Old收集器下的情况)在《深入理解JVM》一书中的——3.6.3长期存活的对象将进入老年代的介绍中,一个例子的jvm参数中加了这一行-XX:+printTenuringDestribution意思是希望每次新生代gc后,可以跟踪Survivor区中的对象的年龄分布。然后还设置了-XX:MaxTenur...转载 2020-03-19 20:21:51 · 2695 阅读 · 0 评论 -
minor gc和full gc触发条件
GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始,把所有可以搜索得到的对象标记为存活对象。GC流程 ,对象如何晋升到老年代对象优先在新生代区中分配,若没有足够空间,Minor GC; 大对象(需要大量连续内存空间)直接进入老年态;长期存活...转载 2020-03-19 18:46:18 · 734 阅读 · 0 评论 -
GC -XX:TargetSurvivorRatio 参数实践及gc日志分析
一些和Survivor区域相关的参数含义和解释可以参考:https://blog.csdn.net/z69183787/article/details/104950273,这里着重写一下自己实践后的结论和表现JVM参数:-verbose:gc-Xmx200M-Xms200M-Xmn50M-XX:TargetSurvivorRatio=60-XX:+PrintTenuringDi...原创 2020-03-19 15:11:22 · 3299 阅读 · 0 评论 -
JVM 优化经验总结
开始之前Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码 (字节码), 就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。注意:本文仅针对 JDK7、HotSPOT Java...转载 2020-03-18 23:03:13 · 614 阅读 · 0 评论 -
MaxTenuringThreshold 和 TargetSurvivorRatio参数说明
-XX:MaxTenuringThreshold 晋升年龄最大阈值,默认15。在新生代中对象存活次数(经过YGC的次数)后仍然存活,就会晋升到老年代。每经过一次YGC,年龄加1,当survivor区的对象年龄达到TenuringThreshold时,表示该对象是长存活对象,就会直接晋升到老年代。-XX:TargetSurvivorRatio 设定survivor区的目标使用率。默认...转载 2020-03-18 23:02:02 · 1510 阅读 · 0 评论 -
JVM Survivor行为一探究竟
MaxTenuringThreshold:说到Survivor就不得不提及这个参数,笨神(微信公众号:"你假笨", 想学习JVM调优的话,强烈推荐关注这个公众号)昨天在JVM分享群里分享了这个参数, 总结如下:这个参数主要作用是设置在YGC的时候,新生代的对象正常情况下最多经过多少次YGC的过程会晋升到老生代,注意是表示最多而不是一定,也就是说某个对象的age其实并不是一定要达到这个值才会晋...转载 2020-03-18 18:04:57 · 1332 阅读 · 0 评论 -
关于JVM参数-XX:SurvivorRatio的理解
关于JVM参数-XX:SurvivorRatio的理解JVM参数中有一个比较重要的参数SurvivorRatio,它定义了新生代中Eden区域和Survivor区域(From幸存区或To幸存区)的比例,默认为8,也就是说Eden占新生代的8/10,From幸存区和To幸存区各占新生代的1/10-XX:SurvivorRatio这里举个例子,如果我们通过设置-Xmn60M来指定新生代分...转载 2020-03-18 18:00:53 · 2341 阅读 · 0 评论 -
JVM调优:卡表(CardTable)简介
我们知道,JVM在进行垃圾收集时,需要先标记所有可达对象,然后再清除不可达对象,释放内存空间。那么,如何快速的找到所有可达对象呢?最简单粗暴的实现,就是每次进行垃圾收集时,都对整个堆中的所有对象进行扫描,找到所有存活对象。逻辑是简单,但性能比较差。简单粗暴的实现方式,通常都是不可取的。那JVM是如何实现快速标记可达对象的?答案是GC Roots。GC Roots是垃圾收集器寻找可达...转载 2020-03-18 10:39:45 · 8469 阅读 · 6 评论 -
回收算法&触发条件&GC(Allocation Failure)引发的一些JVM知识点梳理
日前查看某个程序的日志,发现一直在报GC相关的信息,不确定这样的信息是代表正确还是不正确,所以正好借此机会再复习下GC相关的内容:以其中一行为例来解读下日志信息:[GC (Allocation Failure) [ParNew: 367523K->1293K(410432K), 0.0023988 secs] 522739K->156516K(1322496K), 0.00...转载 2020-03-18 12:22:16 · 2256 阅读 · 0 评论 -
JVM参数:MaxTenuringThreshold和TargetSurvivorRatio说明
-XX:MaxTenuringThreshold在新生代中对象存活次数(经过Minor GC的次数)后仍然存活,就会晋升到旧生代。-XX:TargetSurvivorRatio一个计算期望存活大小Desired survivor size的参数.计算公式: (survivor_capacity * TargetSurvivorRatio) / 100 * sizeof(a转载 2016-10-08 18:43:27 · 7620 阅读 · 1 评论 -
20200317-4、垃圾回收日志与算法深度解读
经过前面对于JVM垃圾回收学习了纯理论相关的东东,这次则要开始用代码编写大量的实验来对理论进行佐证,下面开始,先在IntelliJ IDEA工程中新建一个全新的包:然后新建一个类:接下来则会编写一个超级简单的程序,程序虽简单,但是通过增加一些JVM的参数可以用简单的程序来阐述JVM垃圾回收的很多知识点,所以意义还是挺大的,具体如下:哇,确实是简单,但是这里有个注意点:就是对...转载 2020-03-17 22:28:29 · 556 阅读 · 0 评论 -
20200317-3、JVM垃圾回收器理论分析与详解【纯理论】
内存结构这个在之前的学习中都已经学习过了,复习一下。内存分配堆上分配 大多数情况在eden【年轻代中的一个区域】上分配,偶尔会直接在old【老年代】上分配,细节取决于GC的实现。 栈上分配 原子类型的局部变量。内存回收1、GC要做的是将那些dead的对象所占用的内存回收掉。Hotspot认为没有引用的对象是dead的。 Hotspot将引用分为四种:Strong【...转载 2020-03-17 22:05:09 · 585 阅读 · 0 评论 -
20200317-2、JVM垃圾回收算法分析与演示【纯理论】
接下来则逐一的对其进行学习,不过还是纯理论,比较枯燥但是必须得过一遍。标记-清除算法(Mark-Sweep):算法分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,然后回收所有需要回收的对象。 缺点: a、效率问题:标记和清理两个过程效率都不高。 b、空间问题:标记清理之后会产生大量不连续的内存碎片,空间碎片太多可能会导致后续使用中无法找到足够的连续内存而提前触发另一次的...转载 2020-03-17 20:56:48 · 630 阅读 · 0 评论 -
jdk8 Metaspace 调优
简介从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。当然你也可以通过以下的几个参数对Metaspace进行控制: -XX:MetaspaceSize=N 这个参数是初始化的Metaspace大小,该值越大触发Me...转载 2020-03-17 15:50:53 · 705 阅读 · 0 评论 -
JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
https://www.cnblogs.com/yulei126/p/6777323.html1.背景2.为什么废弃永久代(PermGen)3.深入理解元空间(Metaspace)4.总结========正文分割线=====一、背景1.1 永久代(PermGen)在哪里?根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了):上图引自网络,但有...转载 2019-04-08 10:40:46 · 706 阅读 · 0 评论 -
CMS回收并发失效与晋升失败
CMS垃圾回收失败类型主要是两种:并发失效和晋升失败并发失效在新生代(YoungGen)发生垃圾回收时,达到晋升年龄的对象会被移动到老年代(OldGen)中。如果老年代没有足够的空间容纳这个晋升对象,CMS为了腾出老年代空间,就会从本来的MinorGC退化成FullGC。MinorGC只回收新生代,而FullGC不仅回收新生代,而且还会回收老年代,永久区(PermGen)或元区(M...转载 2020-03-17 14:34:46 · 2273 阅读 · 2 评论 -
20200317-1、JVM垃圾回收重要理论剖析【纯理论】
JVM学习到这里,终于到学习最兴奋的地方了---垃圾回收,在学习它之前还得对JVM垃圾回收相关理论知识进行了解,然后再通过实践来加深对理论的理解,下面直接开始了解相关的理论:JVM运行时内存数据区域:这个在之前其实已经介绍过了,对于JVM的垃圾回收一定是回收内存里面的内容,所以如果不对内存区域的划分,区域存放的内容有所了解,那何谈垃圾回收呢?所以看一下下图对内存区域的划分描述:其这...转载 2020-03-17 13:16:46 · 552 阅读 · 0 评论 -
垃圾收集器GC中parallel scavenge收集器为什么不能CMS配合使用?
首先看一下收集器的分布:1.解答parallel scavenge收集器为什么不能CMS配合使用?首先讲一下Hotspot,HotSpot VM里多个GC有部分共享的代码。有一个分代式GC框架,Serial/Serial Old/ParNew/CMS都在这个框架内;在该框架内的young collector和old collector可以任意搭配使用,所谓的“mix-and-match”...转载 2019-12-06 22:29:48 · 1067 阅读 · 0 评论 -
[JVM]理解GC日志
深入理解Java虚拟机 [JVM]Java内存区域与垃圾收集 - 思维导图 [JVM]类加载机制 - 思维导图 [JVM]OOM实例分析 [JVM]理解Class文件(1):手动解析常量池 [JVM]理解GC日志 [JVM]理解Class文件(2) 1. 输出GC日志通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。先来看一个简单的示例,通过设置...转载 2019-12-06 22:20:34 · 584 阅读 · 0 评论 -
垃圾收集器与内存分配策略
程序计数器,虚拟机栈,本地方法栈这三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每个桢栈中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或线程结束时,内存自然就跟着回收了。Java堆和方法区则不一样,这部分内存的分配和回收都是动态的,垃圾回收机制关注...转载 2019-12-06 22:15:02 · 520 阅读 · 0 评论 -
堆外内存 之 DirectByteBuffer 详解
https://www.jianshu.com/p/007052ee3773堆外内存释放代码:http://blog.csdn.net/z69183787/article/details/79316599堆外内存堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统...转载 2018-02-11 14:04:18 · 1668 阅读 · 0 评论 -
Java 内存区域和GC机制
目录Java垃圾回收概况Java内存区域Java对象的访问方式Java内存分配机制Java GC机制垃圾收集器Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是转载 2016-06-07 20:44:52 · 1162 阅读 · 0 评论 -
反射导致的sun.reflect.inflationThreshold - jvm参数优化
http://hanzheng.github.io/tech/jvm/2013/10/25/last-time-with-jvm.htmlhttps://wujc.cn/archives/90https://www.jianshu.com/p/9f814df5252e简单来说,由于使用太多反射,并且该参数设置的阈值较小导致触发 JVM 的反射优化操作,反射调用时会根据每个方法生成一个包...转载 2019-08-13 11:43:57 · 7990 阅读 · 3 评论 -
JVM 触发Full gc条件
本文参考:http://blog.csdn.net/chenleixing/article/details/46706039 给出各个场景下可能触发full gc的实例代码.1.调用System.gcimport java.util.ArrayList;import java.util.List;/** * * created by: gaoxingliang@outl转载 2016-10-08 16:27:30 · 10850 阅读 · 1 评论 -
eclipse的优化 gc.log
原帖:http://www.javaeye.com/topic/756538性能优化从身边做起。 首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse。优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感觉到明显的卡,也就是没有full GC。 开始: eclipse.ini里加转载 2014-09-08 13:42:43 · 4236 阅读 · 0 评论 -
了解CMS(Concurrent Mark-Sweep)垃圾回收器
1.总体介绍:CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。2.CMS过程:初始标记(STW initial m原创 2016-10-09 16:06:16 · 4014 阅读 · 0 评论 -
JVM GC算法 CMS 详解(转)
前言CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是年老代的回收转载 2016-10-09 16:01:31 · 940 阅读 · 0 评论 -
GC&JVM
http://blog.csdn.net/iter_zc/article/details/41746265转载 2016-06-07 20:48:54 · 841 阅读 · 0 评论 -
Minor GC、Major GC和Full GC之间的区别
对Minor GC和Major GC做点笔记新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,经常会伴随至少一次的 Minor G转载 2016-06-07 20:48:32 · 9985 阅读 · 5 评论 -
Major GC和Full GC的区别是什么?触发条件呢?
作者:RednaxelaFX链接:http://www.zhihu.com/question/41922036/answer/93079526来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。针对HotSpot VM的实现,它里面的GC其实准确分类只有两大种:Partial GC:并不收集整个GC堆的模式Young GC:只收集you转载 2016-06-07 20:26:54 · 14437 阅读 · 0 评论 -
GC 面试心得
在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过。先表达一下我自己对面试的观点:1.笔试、面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见人心”。通过一、二个小时内的做题、交流,只是没有其他办法下进行的无奈之举,所以通过了面试不代表有多成功,没通过也不代表有多失败。2.好的面试官本身交谈的时候就不应当把自己一个居高临下的角色上,应当把自己和转载 2016-04-12 11:23:03 · 3783 阅读 · 1 评论 -
Java垃圾回收机制2
说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集转载 2015-09-21 18:19:03 · 976 阅读 · 0 评论