网站怎么做响应式布局,淄博网站备案,wordpress垂直分页导航插件,卫浴网站设计参考#xff1a;JVM学习笔记#xff08;一#xff09;_卷心菜不卷Iris的博客-CSDN博客
GC垃圾回收面试题#xff1a;
JVM内存模型以及分区#xff0c;需要详细到每个区放什么 堆里面的分区#xff1a;Eden#xff0c;survival from to#xff0c;老年代#xff0c;各…参考JVM学习笔记一_卷心菜不卷Iris的博客-CSDN博客
GC垃圾回收面试题
JVM内存模型以及分区需要详细到每个区放什么 堆里面的分区Edensurvival from to老年代各自的特点。 GC的三种收集方法标记清除、标记整理、复制算法的原理与特点分别用在什么地方
针对RockitMQ 消息中间件的服务器应该使用什么样的GC算法TODO Minor GC与Full GC分别在什么时候发生
GC发生的区域方法区 和 堆 JVM垃圾判定算法对象已死
引用计数法(Reference-Counting) 可达性分析算法根搜索算法
垃圾判定 4.2.1. 引用计数法(Reference-Counting) 引用计数算法是通过判断对象的引用数量来决定对象是否可以被回收。
给对象中添加一个引用计数器每当有一个地方引用它时计数器值就加1当引用失效时计数器值就减1任何时刻计数器为0的对象就是不可能再被使用的。
优点
简单高效现在的objective-c、python等用的就是这种算法。 缺点
引用和去引用伴随着加减算法影响性能
很难处理循环引用相互引用的两个对象则无法释放。
因此目前主流的Java虚拟机都摒弃掉了这种算法。
可达性分析算法
这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点从这些节点开始向下搜索节点所走过的路径称为引用链当一个对象到 GC Roots 没有任何引用链相连的话则证明此对象是不可用的。 在Java语言中可以作为GC Roots的对象包括下面几种
虚拟机栈栈帧中的本地变量表中的引用对象。 方法区中的类静态属性引用的对象。 方法区中的常量引用的对象。 本地方法栈中JNINative方法的引用对象 真正标记以为对象为可回收状态至少要标记两次。
第一次标记不在 GC Roots 链中标记为可回收对象。
第二次标记判断当前对象是否实现了finalize() 方法如果没有实现则直接判定这个对象可以回收如果实现了就会先放入一个队列中。并由虚拟机建立一个低优先级的程序去执行它随后就会进行第二次小规模标记在这次被标记的对象就会真正被回收了
四种引用 平时只会用到强引用和软引用。
强引用
类似于 Object obj new Object(); 只要强引用还存在垃圾收集器永远不会回收掉被引用的对象。
软引用
SoftReference 类实现软引用。在系统要发生内存溢出异常之前才会将这些对象列进回收范围之中进行二次回收。如果这次回收还没有足够的内存才会抛出内存溢出异常。软引用可用来实现内存敏感的高速缓存。
弱引用
WeakReference 类实现弱引用。对象只能生存到下一次垃圾收集之前。在垃圾收集器工作时无论内存是否足够都会回收掉只被弱引用关联的对象。
虚引用
PhantomReference 类实现虚引用。无法通过虚引用获取一个对象的实例为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
作用
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于虚引用必须和引用队列 ReferenceQueue联合使用。当垃圾回收器准备回收一个对象时如果发现它还有虚引用就会在回收对象的内存之前把这个虚引用加入到与之 关联的引用队列中。你声明虚引用的时候是要传入一个queue的。当你的虚引用所引用的对象已经执行完finalize函数的时候就会把对象加到queue里面。你可以通过判断queue里面是不是有对象来判断你的对象是不是要被回收了 GC垃圾回收主要有四大算法怎么找到已死对象并清除
复制算法(Copying) 标记清除(Mark-Sweep) 标记压缩(Mark-Compact)又称标记整理 分代收集算法(Generational-Collection)
GC的特点
次数上频繁收集Young区次数上较少收集Old区基本不动Perm区
垃圾回收算法 在介绍JVM垃圾回收算法前先介绍一个概念Stop-the-World
Stop-the-world意味着 JVM由于要执行GC而停止了应用程序的执行并且这种情形会在任何一种GC算法中发生。当Stop-the-world发生时除了GC所需的线程以外所有线程都处于等待状态直到GC任务完成。事实上GC优化很多时候就是指减少Stop-the-world发生的时间从而使系统具有高吞吐 、低停顿的特点。
1. 复制算法(Copying) 该算法将内存平均分成两部分然后每次只使用其中的一部分当这部分内存满的时候将内存中所有存活的对象复制到另一个内存中然后将之前的内存清空只使用这部分内存循环下去。
优点
实现简单 不产生内存碎片 缺点
将内存缩小为原来的一半浪费了一半的内存空间代价太高如果不想浪费一半的空间就需要有额外的空间进行分配担保以应对被使用的内存中所有对象都100%存活的极端情况所以在老年代一般不能直接选用这种算法。
如果对象的存活率很高我们可以极端一点假设是100%存活那么我们需要将所有对象都复制一遍并将所有引用地址重置一遍。复制这一工作所花费的时间在对象存活率达到一定程度时将会变的不可忽视。 所以从以上描述不难看出复制算法要想使用最起码对象的存活率要非常低才行而且最重要的是我们必须要克服50%内存的浪费。
年轻代中使用的是Minor GC这种GC算法采用的是复制算法(Copying)。
HotSpot JVM把年轻代分为了三部分1个Eden区和2个Survivor区分别叫from和to。默认比例为8:1:1,一般情况下新创建的对象都会被分配到Eden区。因为年轻代中的对象基本都是朝生夕死的(90%以上)所以在年轻代的垃圾回收算法使用的是复制算法。
在GC开始的时候对象只会存在于Eden区和名为“From”的Survivor区Survivor区“To”是空的。紧接着进行GCEden区中所有存活的对象都会被复制到“To”而在“From”区中仍存活的对象会根据他们的年龄值来决定去向。对象在Survivor区中每熬过一次Minor GC年龄就会增加1岁。年龄达到一定值(年龄阈值可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中没有达到阈值的对象会被复制到“To”区域。经过这次GC后Eden区和From区已经被清空。这个时候“From”和“To”会交换他们的角色也就是新的“To”就是上次GC前的“From”新的“From”就是上次GC前的“To”。不管怎样都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程直到“To”区被填满“To”区被填满之后会将所有对象移动到年老代中。 因为Eden区对象一般存活率较低一般的使用两块10%的内存作为空闲和活动区间而另外80%的内存则是用来给新建对象分配内存的。一旦发生GC将10%的from活动区间与另外80%中存活的eden对象转移到10%的to空闲区间接下来将之前90%的内存全部释放以此类推。
2.标记清除(Mark-Sweep) “标记-清除”(Mark Sweep)算法是几种GC算法中最基础的算法是因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。正如名字一样算法分为2个阶段
标记出需要回收的对象使用的标记算法均为可达性分析算法。
回收被标记的对象。 缺点 效率问题两次遍历 空间问题标记清除后会产生大量不连续的碎片。JVM就不得不维持一个内存的空闲列表这又是一种开销。而且在分配数组对象的时候寻找连续的内存空间会不太好找。
3. 标记压缩(Mark-Compact)
标记-整理法是标记-清除法的一个改进版。同样在标记阶段该算法也将所有对象标记为存活和死亡两种状态不同的是在第二个阶段该算法并没有直接对死亡的对象进行清理而是通过所有存活对像都向一端移动然后直接清除边界以外的内存。 优点
标记/整理算法不仅可以弥补标记/清除算法当中内存区域分散的缺点也消除了复制算法当中内存减半的高额代价。
缺点
如果存活的对象过多整理阶段将会执行较多复制操作导致算法效率降低。
老年代一般是由标记清除或者是标记清除与标记整理的混合实现。 4. 分代收集算法(Generational-Collection)
内存效率复制算法标记清除算法标记整理算法此处的效率只是简单的对比时间复杂度实际情况不一定如此。 内存整齐度复制算法标记整理算法标记清除算法。 内存利用率标记整理算法标记清除算法复制算法。
可以看出效率上来说复制算法是当之无愧的老大但是却浪费了太多内存而为了尽量兼顾上面所提到的三个指标标记/整理算法相对来说更平滑一些但效率上依然不尽如人意它比复制算法多了一个标记的阶段又比标记/清除多了一个整理内存的过程
难道就没有一种最优算法吗
回答无没有最好的算法只有最合适的算法。分代收集算法。
分代回收算法实际上是把复制算法和标记整理法的结合并不是真正一个新的算法一般分为老年代Old Generation和新生代Young Generation老年代就是很少垃圾需要进行回收的新生代就是有很多的内存空间需要回收所以不同代就采用不同的回收算法以此来达到高效的回收算法。
年轻代(Young Gen)
年轻代特点是区域相对老年代较小对像存活率低。
这种情况复制算法的回收整理速度是最快的。复制算法的效率只和当前存活对像大小有关因而很适用于年轻代的回收。而复制算法内存利用率不高的问题通过hotspot中的两个survivor的设计得到缓解。
老年代(Tenure Gen)
老年代的特点是区域较大对像存活率高。
这种情况存在大量存活率高的对像复制算法明显变得不合适。一般是由标记清除或者是标记清除与标记整理的混合实现。