做网站需要学的语言和软件,建站教程新手怎么做网站php,乐清生活网,域名已有服务器也有怎么做网站理解jvm的垃圾回收策略#xff0c;需要解决以下3个问题问题1#xff1a;哪些内存需要回收#xff1f;问题2#xff1a;什么时候进行回收#xff1f;问题3#xff1a;怎样来回收#xff1f;【解决问题1】哪些内存需要回收#xff1f;jvm的内存区域有5大块#xff1a;1需要解决以下3个问题问题1哪些内存需要回收 问题2什么时候进行回收 问题3怎样来回收 【解决问题1】哪些内存需要回收jvm的内存区域有5大块1程序计数器线程私有用于记录 当前线程所执行class 字节码的行号计数器 2java 虚拟机栈线程私有指java 方法执行的 内存模型 3本地方法栈线程私有指java 本地方法执行的 内存模型 4java堆线程公有用于存储所有对象实例 和 数组 5方法区线程公有用于存储编译后的 类信息Class类常量静态变量 和 即时编译后的数据 显然线程公有的内存区域需要回收即 java堆 和 方法区看个荔枝以可达性分析算法为荔枝来介绍哪些内存需要回收其基本思想就是通过称为“GC Root”的对象作为起点点向下搜索搜索所走过的路径称为引用链但一个对象到GC Root没有任何引用链相连的话则证明对象是不可用的这时可以考虑通过 相交集和非相交集算法来实现GC Roots的对象包括下面几种ObjectsO1虚拟机栈或本地方法栈中引用的对象 O2方法区中常量或类静态属性引用的对象 【解决问题2】什么时候进行回收显然当 java堆或方法区的内存容量不足以满足class字节码运行时所需要的内存空间的时候就需要进行内存回收因为在运行期间你不知道该字节码文件需要多少内存多大内存【解决问题3】怎样来回收这就不得不讲 垃圾回收算法了。写在前面java堆分为 老年代 和 新生代对象首先分配在新生代Eden区中当在新生代中经过若干次垃圾收集后该对象如果还存在的话就将其移入老年代进行存储算法1标记-清除算法回收老年代首先根据可达性分析标记处需要回收的对象之后再统一回收所有被标记的对象缺点1效率问题标记和清除两个效率都不高 缺点2空间问题标记清除之后会留下大量的内存碎片 以至于可能导致以后分配较大对象时因为无法找到足够的连续内存而不得不提前触发来一次垃圾收集动作 算法2复制算法回收新生代将jvm公共内存主要是堆内存划分为容量相等的两块A 和 B每次只使用其中一块如A 来进行运行时的内存分配当块A要使用完的时候将块A中的还存活的对象复制到 块B上然后一次性回收块A中的使用空间。下一次就使用块B 来进行运行时的内存分配了而块A的使用空间为零即块A的所有空间可用复制垃圾回收算法主要解决的问题是 内存碎片问题。缺点1该算法的代价是将内存缩小了一半内存利用率低 算法3复制算法变体算法回收新生代内存空间并不是像 算法2那样 1:1 的分配而是将内存分为 一块 8个单位的称为 Eden空间的内存 两块 1个单位的称为Survivor 空间的内存记为A和B每次只使用 Eden空间内存 和 其中一块Survivor空间 如A的内存当 上述内存空间要使用完的时候就把 Eden空间和 Survivor A 空间的对象复制到 Survivor B空间中然后再清除 Eden空间 和 Survivor A 空间中的内存下次运行时内存分配区域是 Eden空间 和 Survivor A空间那如果 上述过程中 Survivor B 无法储存 Eden 和 Survivor A 中的对象的时候需要其他内存老年代进行分配担保即借用老年代的一部分内存空间来存储 Eden 和 SurvivorA 中的对象数据。算法4标记整理算法回收老年代该算法类似于 标记清除算法不同的是在清理阶段让所有存活对象都向一端移动然后直接清理内存边界以外的内存算法5算法综述——分代收集算法要知道 java堆内存分为 新生代 和 老年代新生代新生代中每次垃圾收集时都发现有大批对象时区只有少量存活选用复制算法 老年代因为老年代中 对象存活率高没有额外空间对它进行分配担保就必须使用 “标记-清理” 或 标记整理算法 进行回收 【2】Minor GC 和 Full/Major GC1Minor GC新生代GC因为 对象首先分配在 java堆新生代中的 Eden空间如果Eden空间不够用的话就会进行一次 Minor GC2Full/Major GC老年代GC大对象直接进入老年代大对象就是需要大量连续内存空间的对象注意Full/Major GC 比 Minor GC的速度至少慢10倍以上所以能用Minor GC 解决问题 就不要用 Major GC