做磨毛布内销哪个网站比较好,什么网站做首页,上线了 做商务网站,建站推广免费公司一。概述 程序计数器、虚拟机栈、本地方法栈都是随线程生灭#xff0c;栈帧随着方法的进入和退出做入栈和出栈操作#xff0c;实现了自动的内存清理#xff0c;因此#xff0c;内存垃圾回收主要集中于Java堆和方法区中。 GC整体流程示意图#xff1a; ① 年轻代对象的移动… 一。概述 程序计数器、虚拟机栈、本地方法栈都是随线程生灭栈帧随着方法的进入和退出做入栈和出栈操作实现了自动的内存清理因此内存垃圾回收主要集中于Java堆和方法区中。 GC整体流程示意图 ① 年轻代对象的移动 1新创建的对象分配到eden区 2eden区满了触发minor gceden存活的对象被复制到from区年龄1不存活的对象被回收 3当eden区再次满了eden和from区的存活对象被复制到to区from和to区交换。如果to区放不下则晋升到老年代 4几次minor gc后当对象的年龄达到阈值-XXMaxTenuringThreshold默认是15之后就会被从年轻代Promotion到老年代; ② minor gc和major gc的时机 1. 在新生代申请内存空间不足的时候触发垃圾回收 2. 判断老年代剩余空间是否大于年轻代所使用的内存 1. 老年代剩余空间 年轻代所使用空间直接进行Minor GC 2. 老年代剩余空间 年轻代所使用空间这个时候要看有没有设置担保机制-XX:HandlePromotionFailure 1. 设置了担保机制则比较每一次Minor GC后晋升到老年代的平均大小和老年代的剩余空间大小 1. 平均晋升对象大小 老年代剩余空间大小这个时候就执行Minor GC 2. 平均晋升对象大小 老年代剩余空间大小这个时候就先执行Major GC 2. 没设置担保机制则先进行一次Major GC防Minor GC后老年代放不下晋升对象 至于minor gc和major gc如何执行那就是不同垃圾收集器做的事情了。 二。垃圾分类 三。对象存活判断 判断对象是否存活一般有两种方式 引用计数 每个对象有一个引用计数属性新增一个引用时计数加1引用释放时计数减1计数为0时可以回收。此方法简单无法解决对象相互循环引用的问题。 可达性分析Reachability Analysis 从GC Roots开始向下搜索搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时则证明此对象是不可用的。不可达对象。 在Java语言中GC Roots包括 * 虚拟机栈中引用的对象 * 方法区中类静态变量引用的对象 * 方法区中常量引用的对象 * 本地方法栈中JNI引用的对象 四。垃圾收集算法 标记 -清除算法 是最基础的收集算法是因为后续的收集算法都是基于这种思路。 分为“标记”和“清除”两个阶段 标记出所有需要回收的对象 统一回收掉所有被标记的对象 优点简单快捷 缺点内存碎片化严重 复制算法 将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存活着的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉。 每次对其中的一块进行内存回收内存分配时也就不用考虑内存碎片等复杂情况只要移动堆顶指针按顺序分配内存即可实现简单运行高效。只是这种算法的代价是将内存缩小为原来的一半持续复制长生存期的对象则导致效率降低。 优点内存碎片化问题得到部分解决 缺点内存的有效使用率太低。 标记-整理算法 标记过程仍然与“标记-清除”算法一样但后续步骤不是直接清理而是让所有存活的对象都向一端移动然后直接清理掉端边界以外的内存。 优点解决内存碎片化问题并且内存利用率大大提高 缺点内存需要不断地变动效率变低。 分代收集算法 严格来说并不是一种思想或理论而是融合上述3种基础的算法思想而产生的针对不同情况所采用不同算法的组合。 GC分代的基本假设绝大部分对象的生命周期都非常短暂存活时间短。 Java堆分为新生代和老年代根据各个年代特点采用适当的收集算法。在新生代中每次垃圾收集时都发现有大批对象死去只有少量存活那就选用复制算法只需要复制少量存活对象就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保就必须使用“标记-清除”或“标记-整理”算法来进行回收。 五。垃圾收集器 如果说收集算法是内存回收的方法论垃圾收集器就是内存回收的具体实现。 详见JVM 垃圾收集器 六。Stop-The-World 在垃圾回收过程中经常涉及到对对象的挪动导致需要对对象引用进行更新。为了保证引用更新的正确性Java将暂停所有其他的线程这种情况被称为“Stop-The-World”导致系统全局停顿会对系统性能存在影响。 在JVM启动参数的GC参数里加上-XX:PrintGCApplicationStoppedTime可以把全部的JVM停顿时间不只是GC打印在GC日志里。这个参数可以打出几乎一切的停顿…… 2016-08-22T00:19:49.5590800: 219.140: Total time for which application threads were stopped: 0.0053630 seconds